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

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 に答える
1

Visual Studio + nvcc でコンパイルしても問題ありません。どのコンパイラを使用していますか?

それが助けになる場合:make_uint4vector_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 に答える
0

私はライブラリコードを持っていませんが、コンパイラはオーバーロードされたデバイス関数を好まないようです(それらは本当に派手なインラインマクロのように扱われるため)。make_uint4(a,b,c,d)古いものを新しいものでシャドウ(非表示)にmake_uint4(va, vb)し、4つのuintパラメーターを使用して後者を呼び出そうとします。uintからuint2への変換がなく(最初の2つのエラーメッセージで示されているように)、2つの引数(最後のエラーメッセージ)ではなく4つの引数があるため、これは機能しません。

のように少し異なる関数名を使用するmake_uint4_from_uint2sと、問題ありません。

于 2011-03-16T16:30:53.743 に答える