【发布时间】:2016-08-10 10:04:51
【问题描述】:
如果多个线程同时写入一个内存位置,就会出现竞争条件,对吧?? 在我的情况下,同样的事情正在发生..
考虑来自 'reduce.cl' 的模块
int i = get_global_id(0);
int n,j;
n = keyMobj[i]; // this n is the key..It can be either 0 or 1.
for(j=0; j<2; j++)
sumMobj[n*2+j] += dataMobj[i].dattr[j]; //summing operation.
这里,内存位置
sumMobj===> [...0..., ....1...] 被 4 个线程同时访问 &
sumMobj===> [....3..., ....4...] 被6个线程同时访问..
有什么方法可以让它保持并行,比如使用锁定或信号量?因为这个求和是我算法中非常重要的一部分......
【问题讨论】:
-
这些是 sumMobj 和 dataMobj typedef struct data { double dattr[10]; 的定义诠释 d_id; int bestCent; }数据;数据 *dataMboj;和 double *sumMobj = (double *)malloc(sizeof(double) * 2 * 2);
-
@talonmies 实际上是并行加法问题..在opencl内核中。我只是不知道可行的解决方案。
-
如果您怀疑存在竞争条件,为什么不使用屏障?像屏障(CLK_LOCAL_MEM_FENCE);
-
@ocluser 我有多个线程同时访问(写入)单个内存位置。这个函数会'屏障(CLK_LOCAL_MEM_FENCE);'在这种情况下有用吗?我以前没用过。
-
找到 this page,它解释了一种原子添加浮点数的方法,但是您需要使用 cl_khr_int64_base_atomics,并使用 long 和 double 的联合。