我试图通过利用CUDA提供的Atomic操作从浮点值集合中获取最小值。 。由于内存限制,我无法使用缩减。但是,我收到错误消息:指令'{atom,red} .shared'需要.target sm_12或更高当我尝试使用作为“SharedMem”争论传递的__Shared__变量编译下面的代码时。
我有一个9400m的GPU,其计算能力为1.1。
__device__ static float* atomicMin(float* SharedMem, float value, float *old)
{
old[0] = *SharedMem;
float assumed;
if (old[0] <= value)
{
return old;
}
do
{
assumed = old[0];
old[0] = ::atomicCAS((unsigned int*)SharedMem, __float_as_int(assumed), __float_as_int(value));
} while (old[0] != assumed);
return old;
}
例如,调用下面的函数“getMin_Kernel”:
__shared__ __device__ float LowestDistance;
__global__ void getMin_Kernel(float* AllFloats, int* NumberOfFloats)
{
int j = (blockDim.x * blockIdx.x + threadIdx.x);
if (j < NumberOfFloats[0])
{
float myFloat;
myFloat=*(atomicMin(&LowestDistance, NumberOfFloats[0], &myFloat));
}
}
但是,如果我传递一个非共享变量,它编译没有问题,但是,我得到一个运行时错误。我猜测发生运行时错误,因为atomicCAS需要全局或共享变量。任何人都可以帮助解决编译错误。
感谢。
答案 0 :(得分:1)
此表http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#features-and-technical-specifications__feature-support-per-compute-capability提供了各种计算功能及其匹配功能支持的完整说明。
谢谢大家,我没有注意到文档中的额外要点,说明了atomicCas和共享内存变量的条件。我还在学习CUDA的绳索。
感谢。