1

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

问题是:这会有用还是会妨碍你,如果有用的话,你能给我一些我可能会尝试应用它的例子吗?

4

1 回答 1

3

在 NVidia 的架构 GT200 及更高版本上,Modulo 并不是特别慢,并不比普通整数除法慢。有关详细信息,请参阅本文

但是,使用按位与仍然要快得多。由于 GPU 上的函数调用成本很高,因此 OpenCL 编译器默认使用内联来提高性能。函数调用应该没问题,因为它将被内联。

于 2011-01-31T15:06:41.697 回答