我在过去使用C ++这个简单的函数来模拟简单的曲面细分形式。该函数采用数字和除数。除数必须是( 2的幂 - 1),n应该在0和除数之间。它使用按位&。
返回n%(d + 1)的模数结果相当确定该功能如下:
unsigned int BitwiseMod(unsigned int n, unsigned int d){ return n & d; }
我想在OpenCL中有效地使用它,我想知道它是否会像我想象的那样工作。在我看来,模数在GPU上是一项非常昂贵的操作,但我很熟悉使用它来形成幅度空间和其他技术来传播数据。
更常见的是,假设函数有一些开销,我更倾向于简单地写这个。
x[i] = 8*(i&d)+offset[i]; //OR in other contexts,...
num = i&d+offset[i];
x[num] = data;
问题是:这是否有用或妨碍,如果有用,你可以给我一些例子,我可以尝试应用它。
答案 0 :(得分:3)
在NVidia的架构上,GT200及以上,Modulo并不是特别慢,也不比正常的整数分频慢。有关详细信息,请参阅this paper。
但是,使用按位AND仍然要快得多。由于函数调用在GPU上很昂贵,因此OpenCL编译器会默认使用内联来提高性能。你可以使用函数调用,因为它将被内联。