Я хотел бы распараллелить взаимодействие между каждой парой частиц (аналогично моделированию 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;
}