/******************************************************************************* * * MIT License * * Copyright (C) 2021-2025 Advanced Micro Devices, Inc. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * *******************************************************************************/ #ifndef GEMM_GLOBAL_MAPPING_IMPL_HPP #define GEMM_GLOBAL_MAPPING_IMPL_HPP #include "gemm_global_mapping.hpp" namespace rocwmma { namespace GlobalMapping { namespace detail { #define MappingBaseT \ uint32_t BlockM, uint32_t BlockN, uint32_t BlockK, typename InputT, typename OutputT, \ typename ComputeT, typename LayoutA, typename LayoutB, typename LayoutC, typename LayoutD, \ uint32_t BlocksX, uint32_t BlocksY, uint32_t TBlockX, uint32_t TBlockY #define MappingBaseT_impl \ BlockM, BlockN, BlockK, InputT, OutputT, ComputeT, LayoutA, LayoutB, LayoutC, LayoutD, \ BlocksX, BlocksY, TBlockX, TBlockY template template __device__ constexpr inline auto MappingBase::projCoordA(CoordC const& coordC) { return make_coord2d(get<0>(coordC), 0u); } template template __device__ constexpr inline auto MappingBase::projCoordB(CoordC const& coordC) { return make_coord2d(0u, get<1>(coordC)); } /// /// Dimensions /// template __device__ constexpr inline auto MappingBase::macroTileSizeC() { return WaveSpace::workgroupDim() * waveTileSizeC(); } template __device__ constexpr inline auto MappingBase::waveTileSizeC() { return blockSizeC() * make_coord2d(BlocksX, BlocksY); } template __device__ constexpr inline auto MappingBase::blockSizeC() { return make_coord2d((uint32_t)GetIOShape_t::BlockHeight, (uint32_t)GetIOShape_t::BlockWidth); } template __device__ constexpr inline auto MappingBase::kDim() { return BlockK; } /// /// Offsets /// template __device__ constexpr inline auto MappingBase::waveOffsetA() { return projCoordA(waveOffsetC()); } template __device__ constexpr inline auto MappingBase::waveOffsetB() { return projCoordB(waveOffsetC()); } template __device__ constexpr inline auto MappingBase::waveOffsetC() { return WaveSpace::localWaveCoord() * waveTileSizeC(); } template __device__ constexpr inline auto MappingBase::blockOffsetA() { return projCoordA(blockOffsetC()); } template __device__ constexpr inline auto MappingBase::blockOffsetB() { return projCoordB(blockOffsetC()); } template __device__ constexpr inline auto MappingBase::blockOffsetC() { return blockSizeC(); } template __device__ constexpr inline auto MappingBase::kStepOffsetA() { return make_coord2d(0u, BlockK); } template __device__ constexpr inline auto MappingBase::kStepOffsetB() { return make_coord2d(BlockK, 0u); } /// /// Global matrix coords /// template __device__ constexpr inline auto MappingBase::macroTileCoordC() { return WaveSpace::workgroupCoord() * macroTileSizeC(); } template __device__ constexpr inline auto MappingBase::waveTileCoordC() { return macroTileCoordC() + waveOffsetC(); } } #undef MappingBaseT #undef MappingBaseT_impl } // namespace CooperativeGemm } // namespace rocwmma #endif // GEMM_GLOBAL_MAPPING_IMPL_HPP