OpenCL替代模数使用,建议

时间:2011-01-30 10:57:20

标签: optimization opencl bitwise-operators modulo modulus

我在过去使用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;

问题是:这是否有用或妨碍,如果有用,你可以给我一些例子,我可以尝试应用它。

1 个答案:

答案 0 :(得分:3)

在NVidia的架构上,GT200及以上,Modulo并不是特别慢,也不比正常的整数分频慢。有关详细信息,请参阅this paper

但是,使用按位AND仍然要快得多。由于函数调用在GPU上很昂贵,因此OpenCL编译器会默认使用内联来提高性能。你可以使用函数调用,因为它将被内联。