【发布时间】:2011-03-16 10:28:18
【问题描述】:
这可能是一个愚蠢的问题,但是:
在 OpenCL 内核中调用一些 get_* 函数有多贵?将结果保存在某些局部变量中以供将来使用,还是在需要时调用所需的函数更好?
还是依赖于平台?
PS 我认为,cuda 使用各种 threadIdx 变量可以更好地解决它。
【问题讨论】:
这可能是一个愚蠢的问题,但是:
在 OpenCL 内核中调用一些 get_* 函数有多贵?将结果保存在某些局部变量中以供将来使用,还是在需要时调用所需的函数更好?
还是依赖于平台?
PS 我认为,cuda 使用各种 threadIdx 变量可以更好地解决它。
【问题讨论】:
我认为这应该对所有 GPU 架构都是免费的。它应该被相应的硬件寄存器或缓存组中的常量替换。
编译器也可以对其进行持续传播。您可以使用 AMD Stream Analyser 检查自己:
__kernel
void testKernel(__global uint * uintArray)
{
uint threadId = get_global_id(0);
uintArray[threadId] = 0xbaadf00d;
}
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。
所以,为了回答你的问题,我会使用最易读的形式。
【讨论】: