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

GT200 以上の NVidia のアーキテクチャでは、Modulo は特に遅くはなく、通常の整数除算よりも遅くはありません。詳細はこちらの論文をご覧ください。

ただし、ビットごとの AND を使用する方がはるかに高速です。関数呼び出しは GPU でコストがかかるため、OpenCL コンパイラはインライン化を積極的に使用してデフォルトでパフォーマンスを向上させます。インライン化されるため、関数呼び出しで問題ないはずです。

于 2011-01-31T15:06:41.697 に答える