Синхронизация блока Cuda несовместима - PullRequest
0 голосов
/ 28 октября 2019

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

__device__ inline void sync(int *blocksync) {
    atomicAdd(blocksync, 1);
    while(*blocksync!=gridDim.x*gridDim.y){}
    if (threadIdx.x+threadIdx.y+blockIdx.x+blockIdx.y==0){
        atomicAdd(blocksync, -1*(gridDim.x)*(gridDim.y)); 
    }
    while(*blocksync!=0){}
} 

__global__ void simple(int *blocksync){
    for (int it = 0; it<100; it++){
       //do stuff
       if (threadIdx.x+threadIdx.y==0){
            sync(blocksync);
       }
       __syncthreads()

}


Где blockync - это int в памяти изначально 0. Этот код иногда работает, в зависимости от того, сколько итераций я делаю, я бы предположил, что у него будет что-то делатьс блоками, становящимися несинхронизированными, однако я не понимаю, почему это повлияет на решение. Я знаю, что это, вероятно, не оптимальный способ использования графического процессора и как вы обычно пишете cuda и gpu-программирование, но сейчас мне нужно это делать.

...