Cuda カーネルでの使用に適したものにするために、コード内の if ステートメントをいくつか削除しようとしています。if-else ステートメントの形式は次のとおりです。
if(boolean 1) {
double1 = expression1;
}
else if(boolean 2) {
double1 = expression2;
}
else {
double1 = expression3;
}
if ステートメントを削除する私の試みは次のようになります。
double1 = (boolean1) * expression1 +
(!boolean1 && boolean2) * expression2 +
!(boolean1 && boolean2) * expression3;
no-if-statement 形式への変換は問題なく機能しているようです。つまり、おおよその答えが得られます。ただし、わずかな違いがあります。これは、質点の変位を計算するために、同じカーネルを何千回も反復するプログラム用です。テストするために、if ステートメントと no-if ステートメントをわずか 50 タイム ステップで比較しましたが、これが違いです。
if statements: -2.2900031243(9010440)e-004
no if statements: -2.2900031243(8959510)e-004
私はコードをステップ実行し、式を個別に評価し、それらが一致することを発見しました。ブール式と組み合わせた場合にのみ、問題が発生します。ブール式を double にキャストしようとしましたが、同じ答えが出ました。この問題を解決する方法があるかどうか、誰にもわかりませんか? 私の目標は高速化であるため、if ステートメントを使用するのは最後の手段です。上記の両方の数値は、コードを比較するために作成した 2 つの異なる CPU 実装からのものです。これは、GPU 計算と CPU 計算の違いではありません。提案をいただければ幸いです。