2011-01-30 58 views
1

有一个简单的函数,我曾经用C++来模拟简单形式的镶嵌细分。该函数需要一个数字和一个除数。除数必须是(两个幂的两个-1),n应该在0和除数之间。它使用按位&返回n%(d + 1)的模数结果。OpenCL Alternative Modulo Uses,Advice

相当肯定的功能是这样:

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

是不是n&(d-1)而不是n&d? – 2014-09-05 19:40:33

回答

3

在NVidia的架构上,GT200和更高版本,Modulo并不是特别慢,不比正常的整数分频慢。详情请参阅this paper

但是,使用按位AND仍然快很多。由于函数调用在GPU上很昂贵,因此OpenCL编译器主动使用内联来默认提高性能。你应该没问题,因为它会被内联。

+0

这对我来说肯定会造成一些困惑,但是您认为以这种方式使用模函数的功能在GPU编程中会很有用吗? – 2011-02-01 06:34:43