0

我正在尝试以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…"条线。

4

3 回答 3

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);    
于 2011-03-16T16:33:08.907 回答
1

我能够在 VS 2010 和 CUDA 4.0 上获得部分重现(编译器构建的代码正常,但 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);
}

这为我修好了。

于 2011-03-17T02:20:52.770 回答
0

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

使用一个稍微不同的函数名称make_uint4_from_uint2s,你会没事的。

于 2011-03-16T16:30:53.743 回答