OpenCL:最好使用更多寄存器,或者使用位移位运算符来打包值?

OpenCL:最好使用更多寄存器,或者使用位移位运算符来打包值?,opencl,Opencl,在OpenCL中,在GPU上,寄存器压力将降低占用率,因此我们希望减少使用的寄存器数量 在我的程序中,我有大量的值,这些值在编译时是未知的,但通常在0到127之间。我想知道使用位移位运算符将这些寄存器打包到数量较少的寄存器中是否比使用大量寄存器更好 例如,可以创建一些宏,如: #define posToRow( pos ) ( ( pos >> 10 ) & ((1<<10)-1) ) #define posToCol( pos ) ( ( pos ) &

在OpenCL中,在GPU上,寄存器压力将降低占用率,因此我们希望减少使用的寄存器数量

在我的程序中,我有大量的值,这些值在编译时是未知的,但通常在0到127之间。我想知道使用位移位运算符将这些寄存器打包到数量较少的寄存器中是否比使用大量寄存器更好

例如,可以创建一些宏,如:

#define posToRow( pos ) ( ( pos >> 10 ) & ((1<<10)-1) )
#define posToCol( pos ) ( ( pos ) & ((1<<10)-1) )
#define rowColToPos( row, col ) ( ( row << 10 ) | col )
#define linearIdToPos( linearId, base ) ( rowColToPos( ( linearId / base ), ( linearId % base )  ) )

#定义posToRow(pos)((pos>>10)和((1这可能不会以您想要的方式回答您的问题

在OpenCL中,在GPU上,寄存器压力将降低占用率,因此我们希望减少使用的寄存器数量

注册压力确实会降低入住率,但这并不意味着它会因此降低性能:这取决于许多其他因素。如果你还没有读过,我强烈建议你读一下瓦西里·沃尔科夫的书

我想知道使用位移位运算符将这些寄存器打包到数量较少的寄存器中是否比使用大量寄存器更好

开发人员生命中的一条非常重要的规则是“不要优化”。即使在高性能代码中,这条规则仍然有效:

  • 首先,让您的代码正常工作
  • 然后,如果您发现性能不令人满意和/或可以改进,请对其进行分析
  • 然后,找出瓶颈并尝试找到解决方案
总而言之,事先猜测什么可能会或可能不会产生注册压力是毫无意义的。实施、测量、行动。不要试图预测那些还不存在、也可能根本不存在的问题


也就是说,在编写高性能代码(实际上甚至是“标准”代码)时,大多数情况下(如果不总是这样的话),知道几个选项中哪一个最快的唯一方法是实现所有选项并对其进行基准测试。因此,我担心在您进行基准测试之前,您的问题将没有明确的答案。

这可能无法以您希望的方式回答您的问题

在OpenCL中,在GPU上,寄存器压力将降低占用率,因此我们希望减少使用的寄存器数量

注册压力确实会降低入住率,但这并不意味着它会因此降低性能:这取决于许多其他因素。如果你还没有读过,我强烈建议你读一下瓦西里·沃尔科夫的书

我想知道使用位移位运算符将这些寄存器打包到数量较少的寄存器中是否比使用大量寄存器更好

开发人员生命中的一条非常重要的规则是“不要优化”。即使在高性能代码中,这条规则仍然有效:

  • 首先,让您的代码正常工作
  • 然后,如果您发现性能不令人满意和/或可以改进,请对其进行分析
  • 然后,找出瓶颈并尝试找到解决方案
总而言之,事先猜测什么可能会或可能不会产生注册压力是毫无意义的。实施、测量、行动。不要试图预测那些还不存在、也可能根本不存在的问题


也就是说,在编写高性能代码(实际上甚至是“标准”代码)时,大多数情况下(如果不总是这样的话),要知道几个选项中哪一个最快,唯一的方法是实现所有选项并对它们进行基准测试。因此,在您进行基准测试之前,恐怕您的问题没有明确的答案。

正如上面提到的大多数答案一样,请注意不要过度优化代码。
您的值通常在0到127之间,或者这些值总是在这个范围内。否则(如果您已经尝试过,您没有提到):为什么不使用矢量数据(
无符号字符16
)?

正如上面提到的大多数答案一样,请注意不要过度优化代码。
您的值通常在0到127之间,或者这些值总是在这个范围内。否则(如果您已经尝试过,您没有提到):为什么不转向矢量数据(
unsigned char16
)?

这是一篇您刚刚链接到的优秀论文/演示文稿。非常有趣:-)至于我应该进行优化,我已经有了一堆性能合理的内核,现在我要做的就是对它们进行优化。至于基准测试,基准测试只进行到目前为止,因为我只能使用一种nvidia gpu和一种intel gpu,没有amd或其他gpu,所以我需要一些关于一般工作原理的想法,无法在每台设备上实际试用:-PIt已经很难针对一个目标硬件进行优化。在保持便携性的同时进行优化(性能方面)这是非常困难的。这是一个公平的观点。也许我现在只是坚持为nvidia优化。如果AMD想要AMD优化,他们可以提供对AMD gpu云或其他东西的访问:-)请注意,这引出了一个问题,为什么我不在cuda上使用caffe,并且已经完成了:-请注意,您完全避免回答我的问题,但是到沃科夫论文的链接非常有用,而且还没有其他答案,所以现在将您的答案标记为已接受:-)这是您刚刚链接到的一篇很棒的论文/演示文稿。非常有趣:-)就我应该优化而言,我已经有了一堆性能合理的内核,现在我要做的就是优化它们。就基准测试而言,基准测试仅限于此,因为我只能使用一种nvidia gpu和一种intel gpu,没有amd或其他gpu,所以我需要一些关于什么可以正常工作的想法,而不需要在每台设备上实际试用:-PIt已经很难针对一个目标硬件进行优化。光学