あいまいなタイトルで申し訳ありません。
3D 熱伝達でいくつかのシミュレーションを行うためのカーネルを作成しました。私が抱えている問題は、8 コアの Dell Studio XPS で並列に実行されているプログラムのバージョンが GTS-240 GPU を上回っていることです。より速く実行するために多くのことを試みましたが、計算自体が大きすぎるという結論に達しました。計算には約 35 FLOP があり、シミュレーションでセルごとにスレッドを起動するだけです。それでも、GPU では約 3,340 万セル/秒、CPU では 4,040 万/秒しか得られません。GPU は、タイム ステップごとに 170 万個のセルがあり、それぞれでこの計算を行う必要があるこのようなタスクに優れていることを理解していました。
また、計算ごとに 28 の配列アクセスがあり、すべて通常の GPU メモリにあります。
これが計算です。私は本物を投稿しません - それはトップシークレットではなく、単に不必要です. 「f」で始まる変数は浮動小数点数で、「i」は整数を意味します。
f_celldata[iA] =(-f_constA[iA-iB] * (f_mutA[iA] - f_mutA[iA-iB]) / f_constB[iA-1] +
f_constA[iA] * (f_mutA[iA+iB] - f_mutA[iA]) / f_constB[iA]) * (1.0 / f_constB[iA]) +
(-f_constA[iA-iC] * (f_mutA[iA] - f_mutA[iA-iC]) / f_constB[iA-1] +
f_mutA[iA] * (f_constA[iA+*iC] - kern_T_mat[linOffset]) / kern_dy_e[y]) * (1.0 /kern_dy_c[y]) +
(-f_constA[iA-1] * (f_mutA[iA] - f_mutA[iA-1]) / f_constB[iA-1] +
f_constA[iA] * (f_mutA[iA+1] - f_mutA[iA]) / f_constB[iA]) * (1.0 / f_constB[iA]);
明らかに、ここにこれを書き留めたとき、私はちょっとずさんになりました。実際には、計算は可能な限り単純であり、ここでは簡単にするために同じ変数を作成しました。
GPU プログラミングの経験が豊富な人が私にアドバイスをくれることを期待していました。計算が大きすぎて GPU で処理できませんか? 1 回の計算だけで (配列アクセスと FLOP を一緒に)、時間ステップごとに 35 ミリ秒かかります。これは多かれ少なかれ典型的ですか?どうすればもっと速くできるか本当にわかりません。テスラを使えば、仕事はずっと速くなるでしょうか? どれくらい速くなりますか?
ありがとうございました。