我正在尝试使用atomicAdd()对浮点数的向量求和,但是,它似乎没有执行任何加法运算。我使用的是GTX 970 GPU,其计算能力> 2.x,这是根据cuda规范在浮点数上使用atomicAdd()所需要的。
我尝试实现在其他地方找到的解决方案,但得到的结果相同。这是该尝试的代码:
kernel void atomicAdd_floats(volatile global float *address, float value)
{
float oldval, newval, readback;
oldval = *address;
newval = oldval + value;
if (oldval == newval)
{
readback = atomic_xchg(address, newval);
}
while (readback != oldval)
{
oldval = readback;
newval = oldval + value;
}
}
请注意,volatile全局float * address参数是从另一个内核提供的,因此这是一种辅助内核功能。我提供的参数只是我的输出矢量的第一个元素的地址,它实际上存储了我的总和。
我正在跟踪float atomicAdd(float *地址,float val); https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html B.12.1.1节中概述了签名。
这是我的内核代码本质上的样子:
kernel void reduce_add(global const float* input, global float* output) {
float result = 24.24f;
float temp = 234.352f;
float atomicAdd(float *result, float temp);
printf(" %f ", result);
}
此操作的结果始终为24.24。另外请注意,这不是我的实际代码,函数本身相当大,此处的值是用于测试的虚拟值。
使用此操作,我期望atomic_add的结果相同,其中我作为第一个参数提供的地址会添加并将第二个参数的值存储到提供的地址中。但是,它似乎完全忽略了它,每次都返回24.24f。