Как избежать состояния гонки в блоках 2D-потоков в CUDA? - PullRequest
0 голосов
/ 20 октября 2019

Я хотел бы распараллелить взаимодействие между каждой парой частиц (аналогично моделированию N-тела). Я использовал атомарные операции, чтобы избежать состояния гонки, но все еще получаю плохие результаты.

Я использую блоки 2D-потоков:

dim3 block(20, 20, 1);
dim3 grid(20, 20, 1);

Моя функция ядра:

int tid = blockIdx.x * blockDim.x + threadIdx.x;
int tidY = blockIdx.y * blockDim.y + threadIdx.y;

while (tid < numberOfParticle)
{

    while (tidY < numberOfParticle)
    {
        if (tid != tidY)
        {
            if (checkIfPointLiesInsideASphere(&(vectorOfParticles[tid]), &(vectorOfParticles[tidY]), radius))
            {
                int index = atomicAdd(&vectorOfParticles[tid].neighbours, 1);

                atomicExch(&vectorOfParticles[tid].vectorOfNeighbours[index], tidY);
            }
        }

        tidY += blockDim.y * gridDim.y;
    }

    tidY = threadIdx.y + blockIdx.y * gridDim.y;
    tid += blockDim.x * gridDim.x;
}
...