【发布时间】:2019-06-06 02:34:30
【问题描述】:
CUDA编程指南说任何原子操作都可以使用atomicCAS()来实现,并给出了原子双加的例子:
__device__ float single(double *address,double val)
{
unsigned long long int *address_as_ull =(unsigned long long int*)address;
unsigned long long int assumed;
unsigned long long int old = *address_as_ull;
do
{
assumed = old;
old = atomicCAS(address_as_ull,assumed,__double_as_longlong(val + __longlong_as_double(assumed)));
}while(assumed !=old);
return __longlong_as_double(old);
}
现在,我面临的问题是:
我想写一个可以原子操作两个变量地址的函数。
例如: 原子添加大约两个变量
输入
double *address_1, int *address_2
double val_1,int val_2
结果
*address_1 = *address_1+val_1;
*address_2 = *address_2+val_2;
我该如何处理这个问题?谢谢。
【问题讨论】:
-
两次调用原子加法函数有什么问题?从您问题中的描述来看,这两个操作是独立的。
-
这里是一个简单的例子,实际上在这种情况下做两次操作是可以的~但在我的情况下,我需要两个地址的原子函数。你有什么建议吗?谢谢~
-
没有这样的东西
-
我认为使用结构来存储这两个变量可能会有所帮助。你看到 double 被转移到 ull,但我不知道如何处理 unsigned long long int 和结构。