如果没有 CUDA,我的代码只有两个 for 循环,用于计算系统中所有坐标对之间的距离,并将这些距离分类到 bin 中。
我的 CUDA 版本的问题是显然线程不能同时写入相同的全局内存位置(竞争条件?)。我最终为每个 bin 获得的值是不正确的,因为只有一个线程最终写入每个 bin。
__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 来加速这个计算。任何帮助(甚至想法)将不胜感激。我不需要这个优化,只是功能。