pypto_pro.language.get_subblock_num#
产品支持情况#
Ascend 950PR/Ascend 950DT:支持
Atlas A3 训练系列产品/Atlas A3 推理系列产品:不支持
Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持
功能说明#
获取当前block的subblock总数(即一个block关联的从核数量,又称task ration)。
函数原型#
pypto_pro.language.get_subblock_num() -> int
参数说明#
无。
约束说明#
无。
返回值说明#
返回DT_INT64类型的subblock总数。返回值与核类型及编译模式有关:
AIC核:始终返回1(AIC为block,无AIC从核)。
AIV核:
融合算子(mix,AIC:AIV = 1:2):返回2(每个AI Core含2个AIV从核)。
纯Vector算子(aiv-only):返回1(AIV为block,无subblock划分)。
调用示例#
在融合算子中,get_block_idx()在AIV核上返回的是逻辑编号(block_idx * subblock_num + subblock_idx),通过除以get_subblock_num()可还原物理AI Core编号,使cube与vector两侧用统一的core_id切分数据:
import pypto_pro.language as pl
NUM_CORES = 2
@pl.jit(auto_mutex=True)
def matmul_example(
a: pl.Tensor[[pl.DYNAMIC, pl.DYNAMIC], pl.DT_FP16],
b: pl.Tensor[[pl.DYNAMIC, pl.DYNAMIC], pl.DT_FP16],
out: pl.Tensor[[pl.DYNAMIC, pl.DYNAMIC], pl.DT_FP16],
):
num_cores = pl.get_block_num()
# AIC/AIV两侧得到相同的物理核号,详见下方NOTE
core_id = pl.get_block_idx() // pl.get_subblock_num()
with pl.section_cube():
for i in pl.range(core_id, a.shape[0] // 128, num_cores):
... # Cube侧按行块i执行load/matmul/store
with pl.section_vector():
for i in pl.range(core_id, a.shape[0] // 128, num_cores):
... # Vector侧用同一core_id切分,与Cube侧对齐
matmul_example[None, NUM_CORES](a, b, out)
[!NOTE]说明 该除法在AIC核上为block_idx // 1,在AIV核上为(block_idx * 2 + subblock_idx) // 2,两者均得到相同的AI Core编号,因此cube与vector可共享同一core_id做数据切分。