不能重载make_uint4函数

时间:2011-03-16 15:27:54

标签: cuda overloading nvcc

我正试图以下列方式重载make_uint4

namespace A {
  namespace B {
    inline __host__ __device__ uint4 make_uint4(uint2 a, uint2 b) {                                                                                                         
      return make_uint4(a.x, a.y, b.x, b.y);                                                                                                                              
    }
  }
}

但是当我尝试编译它时,nvcc会返回错误:

error: no suitable constructor exists to convert from "unsigned int" to "uint2"
error: no suitable constructor exists to convert from "unsigned int" to "uint2"
error: too many arguments in function call

所有这些错误都指向"return…"行。

3 个答案:

答案 0 :(得分:1)

我在Visual Studio + nvcc中编译它没有问题。你使用什么编译器?

如果有任何帮助:make_uint4在vector_functions.h中定义,第170行为

static __inline__ __host__ __device__ uint4 make_uint4(unsigned int x, unsigned int y, unsigned int z, unsigned int w)
{
  uint4 t; t.x = x; t.y = y; t.z = z; t.w = w; return t;
}

<强>更新 当我在自定义命名空间内尝试重载函数时,我得到类似的错误。你确定你不在里面吗?如果是这样,请尝试将::放在函数调用前面以引用全局范围,即:

return ::make_uint4(a.x, a.y, b.x, b.y);    

答案 1 :(得分:1)

我能够在VS 2010和CUDA 4.0上获得部分repro(编译器构建了代码OK但Intellisense标记了您看到的错误)。请尝试以下方法:

#include "vector_functions.h"

inline __host__ __device__ uint4 make_uint4(uint2 a, uint2 b)    
{        
    return ::make_uint4(a.x, a.y, b.x, b.y);
}

这为我解决了。

答案 2 :(得分:0)

我没有库代码,但似乎编译器不喜欢重载的设备函数(因为它们被视为真正花哨的内联宏)。使用新make_uint4(a,b,c,d)对旧make_uint4(va, vb)进行阴影(隐藏)并尝试使用4个uint参数调用后者。这不起作用,因为没有从uint到uint2的转换(如前两个错误消息所示),而且有4个而不是2个参数(最后一条错误消息)。

使用稍微不同的功能名称,例如make_uint4_from_uint2s,你会没事的。