nak: Add Ampere and Ada latency information

This adds the latency information provided by NVIDIA.  This is copied
from excel spreadsheets provided to Red Hat.

Acked-by: Faith Ekstrand <faith.ekstrand@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33573>
This commit is contained in:
Dave Airlie
2025-02-27 15:58:49 +10:00
committed by Marge Bot
parent 6b8a4e6bb7
commit 7a01953a39
3 changed files with 1592 additions and 6 deletions

View File

@@ -30,6 +30,7 @@ mod sm50;
mod sm70;
mod sm70_encode;
mod sm75_instr_latencies;
mod sm80_instr_latencies;
mod sph;
mod spill_values;
mod to_cssa;

View File

@@ -5,6 +5,7 @@ use crate::ir::*;
use crate::legalize::LegalizeBuilder;
use crate::sm70_encode::*;
use crate::sm75_instr_latencies::SM75Latency;
use crate::sm80_instr_latencies::SM80Latency;
pub struct ShaderModel70 {
sm: u8,
@@ -150,7 +151,9 @@ impl ShaderModel for ShaderModel70 {
return false;
}
if self.is_turing() {
if self.is_ampere() || self.is_ada() {
SM80Latency::needs_scoreboards(op)
} else if self.is_turing() {
SM75Latency::needs_scoreboards(op)
} else {
!op.has_fixed_latency(self.sm())
@@ -182,7 +185,9 @@ impl ShaderModel for ShaderModel70 {
read: &Op,
src_idx: usize,
) -> u32 {
if self.is_turing() {
if self.is_ampere() || self.is_ada() {
SM80Latency::raw(write, dst_idx, Some(read), src_idx)
} else if self.is_turing() {
SM75Latency::raw(write, dst_idx, Some(read), src_idx)
} else {
self.instr_latency(write, dst_idx)
@@ -196,7 +201,9 @@ impl ShaderModel for ShaderModel70 {
write: &Op,
dst_idx: usize,
) -> u32 {
if self.is_turing() {
if self.is_ampere() || self.is_ada() {
SM80Latency::war(read, src_idx, write, dst_idx)
} else if self.is_turing() {
SM75Latency::war(read, src_idx, write, dst_idx)
} else {
// We assume the source gets read in the first 4 cycles. We don't
@@ -213,7 +220,9 @@ impl ShaderModel for ShaderModel70 {
b: &Op,
b_dst_idx: usize,
) -> u32 {
if self.is_turing() {
if self.is_ampere() || self.is_ada() {
SM80Latency::waw(a, a_dst_idx, b, b_dst_idx, a_has_pred)
} else if self.is_turing() {
SM75Latency::waw(a, a_dst_idx, b, b_dst_idx, a_has_pred)
} else {
// We know our latencies are wrong so assume the wrote could happen
@@ -223,7 +232,9 @@ impl ShaderModel for ShaderModel70 {
}
fn paw_latency(&self, write: &Op, dst_idx: usize) -> u32 {
if self.is_turing() {
if self.is_ampere() || self.is_ada() {
SM80Latency::raw(write, dst_idx, None, 0)
} else if self.is_turing() {
SM75Latency::raw(write, dst_idx, None, 0)
} else if self.is_volta() {
match write {
@@ -236,7 +247,9 @@ impl ShaderModel for ShaderModel70 {
}
fn worst_latency(&self, write: &Op, dst_idx: usize) -> u32 {
if self.is_turing() {
if self.is_ampere() || self.is_ada() {
SM80Latency::raw(write, dst_idx, None, 0)
} else if self.is_turing() {
SM75Latency::raw(write, dst_idx, None, 0)
} else {
self.instr_latency(write, dst_idx)

File diff suppressed because it is too large Load Diff