多次调用get_global_id()vs将结果保存在局部变量中?

时间:2010-07-15 14:02:09

标签: cuda opencl

这可能是一个愚蠢的问题,但是: 在OpenCL内核中调用一些get_*函数有多贵?保存结果以便将来在某些本地变量中使用或者在需要时调用所需的函数会更好吗?

或者它取决于平台?

PS 我认为,cuda使用各种threadIdx变量更好地解决了这个问题。

1 个答案:

答案 0 :(得分:6)

我认为这应该对所有GPU架构都是免费的。它应该由相应的硬件寄存器或缓存库中的常量替换。

编译器也可以对其进行持续传播。您可以使用AMD Stream Analyzer 检查自己:

的OpenCL:

__kernel 
void testKernel(__global uint * uintArray)
{
    uint threadId = get_global_id(0);

    uintArray[threadId] = 0xbaadf00d;
}

Radeon HD 5870(赛普拉斯)组装:

0 ALU: ADDR(32) CNT(10) KCACHE0(CB0:0-15) KCACHE1(CB1:0-15) 
      0  x: MOV         R1.x,  (0xBAADF00D, -0.001327039325f).x      
         t: MULLO_INT   ____,  R1.x,  KC0[1].x      
      1  x: ADD_INT     ____,  R0.x,  PS0      
      2  w: ADD_INT     ____,  PV1.x,  KC0[6].x      
      3  z: LSHL        ____,  PV2.w,  (0x00000002, 2.802596929e-45f).x      
      4  y: ADD_INT     ____,  KC1[0].x,  PV3.z      
      5  x: LSHR        R0.x,  PV4.y,  (0x00000002, 2.802596929e-45f).x      
01 MEM_RAT_CACHELESS_STORE_RAW: RAT(1)[R0].x___, R1,  VPM 

此处get_global_id(0)映射到常量缓存库值KC0[1].x。 所以,为了回答你的问题,我会使用最易读的形式。