より大きなコードの一部として、多数の ODE (1000 以上) を並列に統合する CUDA RK4 ソルバーがあります。この操作の 1 つのステップは、各方程式 (またはデータ要素) ごとに異なる「xdot」を計算することです。今のところ、カーネル内の各データ要素の値を計算するためのスイッチケース分岐セットアップがあります。異なるスレッドはすべて同じ 3 ~ 6 個のデータ要素を使用して出力を計算しますが、方法は異なります。たとえば、スレッド 1 の場合、次のようになります。
xdot = データ[0]*データ[0] + データ[1];
一方、スレッド 2 の場合は、
xdot = -2*data[0] + data[2];
等々。したがって、100 個のデータ要素がある場合、実行パスはそれぞれ異なります。
このようなシナリオでスレッド発散のペナルティを回避/減少させる方法はありますか? ブロックごとに 1 つのスレッドのみを実行することは役に立ちますか?