OpenCL错误:具有不同地址空间的两个指针之间的非法隐式转换

OpenCL错误:具有不同地址空间的两个指针之间的非法隐式转换,opencl,atomic,local-variables,Opencl,Atomic,Local Variables,我有一个函数用于浮点原子添加: inline void AtomicAdd(volatile __global float *source, const float operand) { union{unsigned int intVal; float floatVal;} newVal; union{unsigned int intVal; float floatVal;} oldVal; do { oldVal.floatVal = *source;

我有一个函数用于浮点原子添加:

inline void AtomicAdd(volatile __global float *source, const float operand)
{
    union{unsigned int intVal; float floatVal;} newVal;
    union{unsigned int intVal; float floatVal;} oldVal;

    do {
        oldVal.floatVal = *source;
        newVal.floatVal = oldVal.floatVal + operand;;
    }
    while (atomic_cmpxchg((volatile __global unsigned int *)source, oldVal.intVal, newVal.intVal) != oldVal.intVal);
}
以下是调用上述函数的主内核:

__kernel void main_kernel(__global float* image)
{
   AtomicAdd(&image[0], 1.0f); 
}
上述功能运行正常。现在我想引入一个局部变量,强制AtomicAdd在一个工作组中一次性完成:

__kernel void main_kernel(__global float* image)
{
   __local tmpSum[1];
   if(get_local_id(0)==0) { 
      tmpSum[0] = 0.0f; }

   barrier(CLK_LOCAL_MEM_FENCE);
   AtomicAdd(&tmpSum[0], 1.0f);
   barrier(CLK_LOCAL_MEM_FENCE);

   AtomicAdd(&image[0], tmpSum[0]); 
}
日志中出现以下错误:

Build log: 
:422:15: error: illegal implicit conversion between two pointers with         different address spaces
                            AtomicAdd(&tmpSum[0], 1.0f);
                                      ^~~~~~~~~~
:422:15: warning: passing 'float __attribute__((address_space(3))) *' to parameter of type 'float volatile __attribute__((address_space(1))) *' discards qualifiers
                            AtomicAdd(&tmpSum[0], 1.0f);
                                      ^~~~~~~~~~
:17:49: note: passing argument to parameter 'source' here
    inline void AtomicAdd(volatile __global float *source, const float operand)

如您所见,全局指针和本地指针之间的不同地址空间似乎有问题。有人知道这里发生了什么吗?

不可能将
\uuuu local
指针传递到函数中,以获取
\uu global
指针,反之亦然。为了成功构建内核,需要使用
\uu local
指针复制AtomicAdd函数。

不可能将
\uu local
指针传递到使用
\uu global
指针的函数中,反之亦然。为了成功构建内核,需要使用
\u local
指针复制AtomicAdd函数。

我将解决方案放在这里。正如doqtor所指出的那样,_local与_global具有不同的地址空间。所以最简单的方法是重载,不幸的是opencl不支持重载。我必须定义一个新的内联函数并解决这个问题

我把我的解决方案放在这里。正如doqtor所指出的那样,_local与_global具有不同的地址空间。所以最简单的方法是重载,不幸的是opencl不支持重载。我必须定义一个新的内联函数并解决这个问题