CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
120 lines
4.1 KiB
C++
120 lines
4.1 KiB
C++
// Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
#pragma once
|
|
|
|
#include "ck/tensor_description/tensor_adaptor.hpp"
|
|
#include "ck/utility/common_header.hpp"
|
|
#include "ck/utility/scheduler_enum.hpp"
|
|
|
|
namespace ck {
|
|
|
|
enum SchedulerGroup : uint32_t
|
|
{
|
|
SCHED_GROUP_MFMA = 0x008, // Matrix FMA instructions
|
|
SCHED_GROUP_VMEM = 0x020, // Global memory operations
|
|
SCHED_GROUP_LDS_READ = 0x100, // LDS read operations
|
|
SCHED_GROUP_LDS_WRITE = 0x200 // LDS write operations
|
|
};
|
|
|
|
template <index_t BlockSize,
|
|
index_t MPerBlock,
|
|
index_t NPerBlock,
|
|
index_t KPerBlock,
|
|
index_t ABufferLoadWidth,
|
|
index_t BBufferLoadWidth,
|
|
index_t ALDSWriteWidth,
|
|
index_t BLDSWriteWidth,
|
|
index_t ALDSReadWidth,
|
|
index_t BLDSReadWidth,
|
|
index_t MRepeat,
|
|
index_t NRepeat,
|
|
index_t MPerXDL,
|
|
index_t NPerXDL,
|
|
index_t KPerXDL,
|
|
bool IsF4_A = false,
|
|
bool IsF4_B = false,
|
|
bool IsF6_A = false,
|
|
bool IsF6_B = false>
|
|
struct BlockwiseGemmXdlops_pipeline_hotloop_inst
|
|
{
|
|
static constexpr index_t WaveNumM = MPerBlock / (MRepeat * MPerXDL);
|
|
static constexpr index_t WaveNumN = NPerBlock / (NRepeat * NPerXDL);
|
|
static constexpr index_t WaveSize = BlockSize / WaveNumM / WaveNumN;
|
|
|
|
static constexpr index_t A_LDS_Read_Width = ALDSReadWidth;
|
|
static constexpr index_t B_LDS_Read_Width = BLDSReadWidth;
|
|
|
|
static constexpr index_t A_Buffer_Load_Inst_Num =
|
|
MPerBlock * KPerBlock / (BlockSize * ABufferLoadWidth);
|
|
static constexpr index_t B_Buffer_Load_Inst_Num =
|
|
NPerBlock * KPerBlock / (BlockSize * BBufferLoadWidth);
|
|
|
|
static constexpr index_t A_LDS_Write_Inst_Num =
|
|
MPerBlock * KPerBlock / (BlockSize * ALDSWriteWidth);
|
|
static constexpr index_t B_LDS_Write_Inst_Num =
|
|
NPerBlock * KPerBlock / (BlockSize * BLDSWriteWidth);
|
|
|
|
static constexpr index_t A_LDS_Read_Inst_Num =
|
|
WaveNumN * MPerBlock * KPerBlock / (BlockSize * ALDSReadWidth);
|
|
static constexpr index_t B_LDS_Read_Inst_Num =
|
|
WaveNumM * NPerBlock * KPerBlock / (BlockSize * BLDSReadWidth);
|
|
|
|
static constexpr index_t C_MFMA_Inst_Num =
|
|
MPerBlock * NPerBlock * KPerBlock / (BlockSize / WaveSize) / (MPerXDL * NPerXDL * KPerXDL);
|
|
|
|
static constexpr index_t C_MFMA_SpeedUp =
|
|
#if defined(__gfx125__)
|
|
(IsF4_A && IsF4_B) ? 2 : 1; // gfx1250: 2x speedup only if BOTH are FP4
|
|
#else
|
|
((IsF4_A || IsF6_A) && (IsF4_B || IsF6_B))
|
|
? 2
|
|
: 1; // Other archs: 2x speedup if BOTH are FP4 or FP6
|
|
#endif
|
|
|
|
static constexpr index_t C_MFMA_Inst_Cycle = []() {
|
|
if constexpr(NPerXDL == 16)
|
|
{
|
|
return KPerXDL == 128 ? 32 / C_MFMA_SpeedUp : 16 / C_MFMA_SpeedUp;
|
|
}
|
|
else if constexpr(NPerXDL == 32)
|
|
{
|
|
return KPerXDL == 64 ? 64 / C_MFMA_SpeedUp : 32 / C_MFMA_SpeedUp;
|
|
}
|
|
}();
|
|
|
|
static constexpr auto Print()
|
|
{
|
|
printf(" Blk/Wave Size: %d, %d, M/N/K PerBlk: %d, %d, %d, M/N/K PerXdl: %d, %d, %d\n",
|
|
BlockSize,
|
|
WaveSize,
|
|
MPerBlock,
|
|
NPerBlock,
|
|
KPerBlock,
|
|
MPerXDL,
|
|
NPerXDL,
|
|
KPerXDL);
|
|
|
|
printf(" A/B buffer load inst: %d, %d\n A/B LDS write inst: %d, %d\n A/B LDS read inst: "
|
|
"%d, %d\n C MFMA inst: %d C MFMA cycle: %d\n"
|
|
"A/B LDS read width: %d, %d, A/B LDS write width: %d, %d, A/B buffer load width: "
|
|
"%d/ %d\n",
|
|
A_Buffer_Load_Inst_Num,
|
|
B_Buffer_Load_Inst_Num,
|
|
A_LDS_Write_Inst_Num,
|
|
B_LDS_Write_Inst_Num,
|
|
A_LDS_Read_Inst_Num,
|
|
B_LDS_Read_Inst_Num,
|
|
C_MFMA_Inst_Num,
|
|
C_MFMA_Inst_Cycle,
|
|
A_LDS_Read_Width,
|
|
B_LDS_Read_Width,
|
|
ALDSWriteWidth,
|
|
BLDSWriteWidth,
|
|
ABufferLoadWidth,
|
|
BBufferLoadWidth);
|
|
}
|
|
};
|
|
|
|
} // namespace ck
|