三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

CANN/cannbot-skills SIMT线程排布模式

CANN/cannbot-skills SIMT线程排布模式

线程排布统一编程模式

【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills

标准模式

SIMT 算子采用统一的线程排布 for 循环模式,每个线程以 stride 间隔遍历数据:

for (uint64_t index = static_cast<uint64_t>( AscendC::Simt::GetBlockIdx() * AscendC::Simt::GetThreadNum() + AscendC::Simt::GetThreadIdx()); index < count; index += (AscendC::Simt::GetThreadNum() * AscendC::Simt::GetBlockNum())) { // 每个线程处理 stride 间隔的元素 }

索引计算 API

API说明
AscendC::Simt::GetThreadIdx()当前线程索引
AscendC::Simt::GetThreadNum()纯线程总数
AscendC::Simt::GetBlockIdx()当前核索引
AscendC::Simt::GetBlockNum()核总数

索引计算分解

初始 index = blockIdx * threadNum + threadIdx 步进 stride = threadNum * blockNum
  • 初始 index:将线程在全局中的起始位置线性化
  • 步进 stride:所有核所有线程的总数,确保每个元素只被一个线程处理

Select 算子示例

template <typename T> __simt_vf__ __aicore__ LAUNCH_BOUND(2048) inline void OpSelectSimt( int32_t needCoreNum, int32_t threadNum, int64_t currentCoreElements, __gm__ uint8_t* condition, __gm__ T* x1, __gm__ T* x2, __gm__ T* y) { for (uint64_t index = static_cast<uint64_t>( AscendC::Simt::GetBlockIdx() * AscendC::Simt::GetThreadNum() + AscendC::Simt::GetThreadIdx()); index < count; index += (AscendC::Simt::GetThreadNum() * AscendC::Simt::GetBlockNum())) { y[index] = condition[index] ? x1[index] : x2[index]; } }

【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

← 返回列表