FP8 roofline support (#592)
Adding FP8 datatype to roofline feature in rocprof-compute on MI300-based systems. FP8 now shows in terminal output and roofline csv, and outputs a standalone PDF. --------- Signed-off-by: Carrie Fallows <Carrie.Fallows@amd.com>
This commit is contained in:
committed by
Vignesh Edithal
szülő
f64c83fc5e
commit
848fa1dc18
@@ -441,9 +441,9 @@ successfully.
|
||||
|
||||
.. note::
|
||||
|
||||
ROCm Compute Profiler generates two roofline outputs to organize results and reduce
|
||||
clutter. One chart plots FP32/FP64 performance while the other plots I8/FP16
|
||||
performance.
|
||||
ROCm Compute Profiler generates three roofline outputs to organize results and reduce
|
||||
clutter. One chart plots FP32/FP64 performance, one plots I8/FP16
|
||||
performance, and the other plots FP8 performance.
|
||||
|
||||
The following image is a sample ``empirRoof_gpu-0_int8_fp16.pdf`` roofline
|
||||
plot.
|
||||
|
||||
@@ -4,6 +4,9 @@ pmc: SQ_INSTS_VALU_ADD_F64 SQ_INSTS_VALU_MUL_F64 SQ_INSTS_VALU_FMA_F64 SQ_
|
||||
|
||||
pmc: SQ_LDS_IDX_ACTIVE SQ_LDS_BANK_CONFLICT TCP_TOTAL_CACHE_ACCESSES_sum TCP_TCC_WRITE_REQ_sum TCP_TCC_ATOMIC_WITH_RET_REQ_sum TCP_TCC_ATOMIC_WITHOUT_RET_REQ_sum
|
||||
|
||||
#ROOF:MI300
|
||||
pmc: SQ_INSTS_VALU_MFMA_MOPS_F8
|
||||
|
||||
range:
|
||||
gpu:
|
||||
kernels:
|
||||
|
||||
@@ -130,6 +130,9 @@ class Roofline:
|
||||
dtype="I8",
|
||||
fig=fp16_fig,
|
||||
)
|
||||
if self.__mspec.gpu_series != "MI200":
|
||||
fig_fp8 = self.generate_plot(dtype="FP8")
|
||||
|
||||
# Create a legend and distinct kernel markers. This can be saved, optionally
|
||||
self.__figure = go.Figure(
|
||||
go.Scatter(
|
||||
@@ -163,6 +166,11 @@ class Roofline:
|
||||
self.__run_parameters["workload_dir"]
|
||||
+ "/empirRoof_gpu-{}_int8_fp16.pdf".format(dev_id)
|
||||
)
|
||||
if self.__mspec.gpu_series != "MI200":
|
||||
fig_fp8.write_image(
|
||||
self.__run_parameters["workload_dir"]
|
||||
+ "/empirRoof_gpu-{}_fp8.pdf".format(dev_id)
|
||||
)
|
||||
# only save a legend if kernel_names option is toggled
|
||||
if self.__run_parameters["include_kernel_names"]:
|
||||
self.__figure.write_image(
|
||||
@@ -178,6 +186,11 @@ class Roofline:
|
||||
self.__run_parameters["workload_dir"]
|
||||
+ "/empirRoof_gpu-{}_int8_fp16.pdf".format(dev_id)
|
||||
)
|
||||
if self.__mspec.gpu_series != "MI200":
|
||||
fig_fp8.write_image(
|
||||
self.__run_parameters["workload_dir"]
|
||||
+ "/empirRoof_gpu-{}_fp8.pdf".format(dev_id)
|
||||
)
|
||||
if self.__run_parameters["include_kernel_names"]:
|
||||
self.__figure.write_image(
|
||||
self.__run_parameters["workload_dir"] + "/kernelName_legend.pdf"
|
||||
|
||||
@@ -56,6 +56,7 @@ class AI_Data:
|
||||
|
||||
total_flops: float
|
||||
valu_flops: float
|
||||
mfma_flops_f8: float
|
||||
mfma_flops_f16: float
|
||||
mfma_flops_bf16: float
|
||||
mfma_flops_f32: float
|
||||
@@ -193,11 +194,11 @@ def calc_ai(mspec, sort_type, ret_df):
|
||||
df = df.sort_values(by=["Kernel_Name"])
|
||||
df = df.reset_index(drop=True)
|
||||
|
||||
total_flops = valu_flops = mfma_flops_bf16 = mfma_flops_f16 = mfma_iops_i8 = (
|
||||
mfma_flops_f32
|
||||
) = mfma_flops_f64 = lds_data = L1cache_data = L2cache_data = hbm_data = calls = (
|
||||
totalDuration
|
||||
) = avgDuration = 0.0
|
||||
total_flops = valu_flops = mfma_flops_f8 = mfma_flops_bf16 = mfma_flops_f16 = (
|
||||
mfma_iops_i8
|
||||
) = mfma_flops_f32 = mfma_flops_f64 = lds_data = L1cache_data = L2cache_data = (
|
||||
hbm_data
|
||||
) = calls = totalDuration = avgDuration = 0.0
|
||||
|
||||
kernelName = ""
|
||||
|
||||
@@ -250,6 +251,8 @@ def calc_ai(mspec, sort_type, ret_df):
|
||||
+ (df["SQ_INSTS_VALU_MFMA_MOPS_F32"][idx] * 512)
|
||||
+ (df["SQ_INSTS_VALU_MFMA_MOPS_F64"][idx] * 512)
|
||||
)
|
||||
if mspec.gpu_series != "MI200":
|
||||
total_flops += df["SQ_INSTS_VALU_MFMA_MOPS_F8"][idx] * 512
|
||||
except KeyError:
|
||||
console_debug(
|
||||
"roofline",
|
||||
@@ -288,6 +291,8 @@ def calc_ai(mspec, sort_type, ret_df):
|
||||
pass
|
||||
|
||||
try:
|
||||
if mspec.gpu_series != "MI200":
|
||||
mfma_flops_f8 += df["SQ_INSTS_VALU_MFMA_MOPS_F8"][idx] * 512
|
||||
mfma_flops_f16 += df["SQ_INSTS_VALU_MFMA_MOPS_F16"][idx] * 512
|
||||
mfma_flops_bf16 += df["SQ_INSTS_VALU_MFMA_MOPS_BF16"][idx] * 512
|
||||
mfma_flops_f32 += df["SQ_INSTS_VALU_MFMA_MOPS_F32"][idx] * 512
|
||||
@@ -388,6 +393,7 @@ def calc_ai(mspec, sort_type, ret_df):
|
||||
calls,
|
||||
total_flops / calls,
|
||||
valu_flops / calls,
|
||||
mfma_flops_f8 / calls,
|
||||
mfma_flops_f16 / calls,
|
||||
mfma_flops_bf16 / calls,
|
||||
mfma_flops_f32 / calls,
|
||||
@@ -406,11 +412,11 @@ def calc_ai(mspec, sort_type, ret_df):
|
||||
kernelName, idx, calls
|
||||
)
|
||||
)
|
||||
total_flops = valu_flops = mfma_flops_bf16 = mfma_flops_f16 = mfma_iops_i8 = (
|
||||
mfma_flops_f32
|
||||
) = mfma_flops_f64 = lds_data = L1cache_data = L2cache_data = hbm_data = (
|
||||
calls
|
||||
) = totalDuration = avgDuration = 0.0
|
||||
total_flops = valu_flops = mfma_flops_f8 = mfma_flops_bf16 = (
|
||||
mfma_flops_f16
|
||||
) = mfma_iops_i8 = mfma_flops_f32 = mfma_flops_f64 = lds_data = (
|
||||
L1cache_data
|
||||
) = L2cache_data = hbm_data = calls = totalDuration = avgDuration = 0.0
|
||||
|
||||
if sort_type == "dispatches":
|
||||
myList.append(
|
||||
@@ -419,6 +425,7 @@ def calc_ai(mspec, sort_type, ret_df):
|
||||
calls,
|
||||
total_flops,
|
||||
valu_flops,
|
||||
mfma_flops_f8,
|
||||
mfma_flops_f16,
|
||||
mfma_flops_bf16,
|
||||
mfma_flops_f32,
|
||||
@@ -432,11 +439,11 @@ def calc_ai(mspec, sort_type, ret_df):
|
||||
avgDuration,
|
||||
)
|
||||
)
|
||||
total_flops = valu_flops = mfma_flops_bf16 = mfma_flops_f16 = mfma_iops_i8 = (
|
||||
mfma_flops_f32
|
||||
) = mfma_flops_f64 = lds_data = L1cache_data = L2cache_data = hbm_data = (
|
||||
calls
|
||||
) = totalDuration = avgDuration = 0.0
|
||||
total_flops = valu_flops = mfma_flops_f8 = mfma_flops_bf16 = (
|
||||
mfma_flops_f16
|
||||
) = mfma_iops_i8 = mfma_flops_f32 = mfma_flops_f64 = lds_data = (
|
||||
L1cache_data
|
||||
) = L2cache_data = hbm_data = calls = totalDuration = avgDuration = 0.0
|
||||
|
||||
myList.sort(key=lambda x: x.totalDuration, reverse=True)
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -121,6 +121,7 @@ ROOF_ONLY_FILES = sorted(
|
||||
[
|
||||
"empirRoof_gpu-0_fp32_fp64.pdf",
|
||||
"empirRoof_gpu-0_int8_fp16.pdf",
|
||||
"empirRoof_gpu-0_fp8.pdf",
|
||||
"pmc_perf.csv",
|
||||
"pmc_perf_0.csv",
|
||||
"pmc_perf_1.csv",
|
||||
|
||||
Reference in New Issue
Block a user