无原子操作
当进行“读取-修改-写入”操作序列的时候,大量的线程修改一段较小的内存区域将带来很多麻烦。例如将d_out[i]++,这段代码先将d_out[i]的原值从储存器中读取出来,然后执行了+1操作,再将结果回写到储存器。然而多个线程在这个区域操作可能会得到错误的结果。
下面例子,理想情况下每个相同的内存中的元素位置将有1000个线程进行(+1)的运算,数组中的每个位置的元素将被增加1000(次个1),单输出结果并非如此。这是因为很多线程同时读取同样的位置,然后增加同样的值,并将它们储存到显存中。
#include <stdio.h>
#define N 5
__global__ void gpu_global_memory(int* d_a