3

次のようにして、2つのfloat4の間にoperator+を作成しました。

__device__ float4 operator+(float4 a, float4 b) {
 // ...
}

ただし、さらにuchar4のoperator +が必要な場合は、uchar4で同じことを行うと、次のエラーが発生します。「エラー:オーバーロードされた関数「operator+」の複数のインスタンスに「C」リンケージがあります」

同じ名前で引数が異なる複数の関数を宣言すると、同様のエラーメッセージが表示されます。だから、2つの質問:

  • ポリモーフィズム:Cudaで同じ名前と異なる引数を持つ複数の関数を持つことは可能ですか?もしそうなら、なぜこのエラーメッセージが表示されるのですか?
  • float4のoperator+:この機能は「cutil_math.h」を含めることですでに含まれているようですが、それを含めると(#include <cutil_math.h>)、そのようなファイルやディレクトリがないと文句を言います...特に何かする必要がありますか?注:Python用のcudaであるpycudaを使用しています。

ありがとう!

4

1 に答える 1

4

エラーの「has"C"linkage」に注意してください。Cリンケージを使用してコードをコンパイルしています(pyCUDAは、シンボルのマングリングの問題を回避するためにデフォルトでこれを実行します)。C ++は、Cリンケージを使用した同じ関数名の複数の定義をサポートできません。

解決策は、自動的に生成された「extern C」を使用せずにコードをコンパイルし、カーネルに対してのみCリンケージを明示的に指定することです。したがって、コードは次のようになります。

__device__ float4 operator+(float4 a, float4 b) { ... };

extern "C"
__global__ void kernel() { };

放出される標準のpyCUDAではなく:

extern "C" 
{
     __device__ float4 operator+(float4 a, float4 b) { ... };

     __global__ void kernel() { };
}

pycuda.compiler.SourceModuleジャストインタイムコンパイルシステムによって発行されるno_extern_c かどうかを制御するために使用できるオプションがあります。extern "C"

于 2012-11-05T07:57:17.380 に答える