在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 ) ) )
对此的想法?有这方面的经验吗?似乎优点/缺点是:
答案 0 :(得分:4)
这可能无法以您想要的方式回答您的问题。
在OpenCL中,在GPU上,寄存器压力会降低占用率,因此我们希望减少使用的寄存器数量。
注册压力确实会降低占用率,但这并不意味着它会降低性能:它取决于许多其他因素。如果您尚未阅读,我强烈建议您阅读Vasily Volkov的Better Performance at Lower Occupancy。
我想知道使用位移运算符将这些寄存器封装到更少数量的寄存器中是否更好?而不是使用大量寄存器?
开发人员生活中一个非常重要的规则是“不要优化”。即使在高性能代码中,此规则仍然存在:
总而言之,尝试提前猜测可能会或可能不会产生注册压力是毫无意义的。实施,衡量,行动。不要试图预测尚不存在的问题,而且可能根本就不存在。
话虽如此,大部分时间(如果不是总是),在编写高性能代码(实际上甚至是“标准”代码)时,知道哪个选项在几个之间最快的唯一方法是实现所有他们和基准他们。因此,在你做这样的基准测试之前,我担心你的问题没有明确的答案。
答案 1 :(得分:1)
正如上面提到的大多数答案,请注意不要过度优化代码。
您的值通常介于0到127之间,或者这些值始终在此范围内。否则(你没有提及,如果你已经尝试过):为什么不转向矢量数据(unsigned char16
)?