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