CUDA を使用しない場合、私のコードは、システム内のすべての座標ペア間の距離を計算し、それらの距離をビンに並べ替える 2 つの for ループだけです。
私の CUDA バージョンの問題は、明らかに複数のスレッドが同時に同じグローバル メモリ ロケーションに書き込めないことです (競合状態?)。スレッドの 1 つだけが各ビンに書き込みを終了したため、ビンごとに得られる値は正しくありません。
__global__ void computePcf(
double const * const atoms,
double * bins,
int numParticles,
double dr) {
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < numParticles - 1) {
for (int j = i + 1; j < numParticles; j++) {
double r = distance(&atoms[3*i + 0], &atoms[3*j + 0]);
int binNumber = floor(r/dr);
// Problem line right here.
// This memory address is modified by multiple threads
bins[binNumber] += 2.0;
}
}
}
だから…どうすればいいのかわからない。私はグーグルで共有メモリについて読んでいますが、問題は、距離の計算を行うまで、どのメモリ領域にアクセスするのかわからないことです!
VMDと呼ばれるプログラムがGPUを使用してこの計算を高速化するため、これが可能であることはわかっています。任意のヘルプ (またはアイデア) をいただければ幸いです。これを最適化する必要はありません。機能的なだけです。