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

发布于 2024-09-10 05:03:48 字数 177 浏览 1 评论 0原文

这可能是一个愚蠢的问题,但是: 在 OpenCL 内核中调用某些 get_* 函数的成本有多高?是将结果保存在某些局部变量中以供将来使用更好,还是在需要时调用所需的函数更好?

或者它依赖于平台?

聚苯乙烯 我认为,cuda 通过各种 threadIdx 变量可以更好地解决这个问题。

It is probably a silly question, but:
How expensive is it to call some get_* function in OpenCL-kernels? Is it better to save the result for future usage in some local varialbe or to call the desired function whenever it needed?

Or it is platform dependent?

PS
I think, cuda solves it better with various threadIdx variables.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

心是晴朗的。 2024-09-17 05:03:48

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

编译器还可以对其进行持续传播。您可以使用 AMD Stream Analyser 进行检查:

OpenCL:

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

    uintArray[threadId] = 0xbaadf00d;
}

Radeon HD 5870 (Cypress) 程序集:

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
因此,为了回答您的问题,我将使用最易读的形式。

I think this should be free for all GPU architectures. It should be replaced by a corresponding hardware register or a constant in a cache bank.

Compiler could also do constant propagation on it. You can check yourself using AMD Stream Analyser:

OpenCL:

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

    uintArray[threadId] = 0xbaadf00d;
}

Radeon HD 5870 (Cypress) assembly:

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 

Here get_global_id(0) maps to constant cache bank value KC0[1].x.
So, for answering your question I would use the most readable form.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文