OpenCL获取速度/寄存器中的本地id成本

OpenCL获取速度/寄存器中的本地id成本,opencl,Opencl,在OpenCL内核中,多次调用get\u local\u id(0)而不是在顶部调用一次,然后再从局部变量访问该值,是否会比较慢 通过不将get\u local\u id(0)存储到一个局部变量,而是多次调用它,我是否可以少用一个寄存器?在大多数GPU体系结构上,本地工作项id将保存在一组特殊的寄存器中,这些寄存器由硬件在分派线程时设置。这意味着,当您执行get_local_id(0)时,您实际上只是从寄存器中读取数据,即没有速度损失“调用”get_local_id(0) 编译器应该注意是否将g

在OpenCL内核中,多次调用
get\u local\u id(0)
而不是在顶部调用一次,然后再从局部变量访问该值,是否会比较慢


通过不将
get\u local\u id(0)
存储到一个局部变量,而是多次调用它,我是否可以少用一个寄存器?

在大多数GPU体系结构上,本地工作项id将保存在一组特殊的寄存器中,这些寄存器由硬件在分派线程时设置。这意味着,当您执行get_local_id(0)时,您实际上只是从寄存器中读取数据,即没有速度损失“调用”get_local_id(0)

编译器应该注意是否将get_local_id(0)分配给变量以供后续使用,并生成与每次获取get_local_id(0)相同的代码。但是,根据我的经验,情况并非总是如此,您会注意到,不使用变量存储本地id只保存了一个寄存器


如果您的注册表很紧,我建议每次都调用get_local_id(0)。您甚至可以设置一个宏来隐藏是调用get_local_id(0)还是使用寄存器。如果您有多余的寄存器(探查器会告诉您这一点),或者您更喜欢使用变量的代码,那么就使用变量。

如果有的话,您的优化器很可能知道所有这些,因为他知道
get\u local\u id
返回的值不会在一次调用中更改。但检查它的一个好的开始可能是只查看生成的程序集(NVidia编译器应该能够从OpenCLC生成PTX,我想AMD也有类似的功能)。据我所知,我没有做任何更改(只要优化是打开的,这是默认的)。谢谢大家!我非常感谢你的建议。我会检查装配。让我们知道你发现了什么!