私はこの単純なループをCUDAで実現したいと思います。CUDAでのシーケンシャルプログラミング
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
x[i, j] = (x0[i, j] + a*(x[i - 1, j] + x[i + 1, j] + x[i, j - 1] + x[i, j + 1]))/c;
}
}
問題は次のとおりです。 X [i、j] X(i-1、j)とX [i、j-1]の新しい値を知る必要がある。しかし、GPUはすべてを並列に計算しているので、CPUとGPUから受け取った結果は異なります。私はCUDAとcudaDeviceSynchronize()について動的パラレル化についての情報を見つけましたが、それは有用かもしれませんが、とにかくカーネルにこのループを実装する方法はまだ分かりません。私はあなたの助けに感謝します。
フィルターを実装しましたか?その場合は、CPUのコードが間違っています。ソースデータを計算する前にコピーする必要があります – Joe
別のスレッドによって並列に変更された可能性のあるデータにアクセスしていることを考えれば、最も単純な回避策は1つのバッファから値を読み取ることです"入力")、あなたの計算を別のものに書きます( "出力")。 これは、ぼかしや中央値など、隣接ピクセル値を必要とするフィルタを行う方法です。 – Taro
いいえ、フィルタではありません。液体シミュレータ(Stamによる)からの線形方程式ソルバーです。私の目標は、コードをGPUコードに変更することです。しかし、あなたの提案は正しいかもしれません...私は入力データをコピーする必要がありますし、それは...それはまだ私が推測するパラレルです。私はそれをCPUバージョンのように順次作成する必要があります。 – frankozx