1

sm_21 アーキテクチャを使用する CUDA 対応 GPU を最大限に活用するには、カーネルを uint2 などのベクトル データ型で記述する必要があります。

次のようなカーネルの行を想像してください。

uint2 a = make_uint2 (123);

これはうまくいきます。値 123 は ax と ay の両方に格納されます。しかし、特に大きなコード ブロックを記述し、多くの変数を初期化する必要がある場合、書き込みを読み取るのは面倒です。

私はプレーンな C コードを書くことに慣れているので、C++ オタクではありません。多分私が探しているのはかなり単純です。

演算子を「オーバーロード」する可能性があることは知っています。私の質問は次のとおりです。代入演算子もオーバーロードできますか?

私はこれを試しました:

inline __device__ uint2 operator = (int a)
{
  return make_uint2 (a, a);
}

しかし、次のエラー メッセージで失敗します。

エラー: "operator=" はメンバー関数でなければなりません

誰?

4

1 に答える 1

4

代入演算子をオーバーロードすること可能ですが、(エラーメッセージが示しているように)それはメンバー関数でなければなりません。つまり、これを使用するには、の「ラッパー」として機能するクラスを作成する必要がありますuint2。ただし、これを行うと、実際にはオーバーロードする必要がない/オーバーロードしたくない可能性がかなり高くなりoperator=ます。むしろ、aからラッパーのインスタンスを作成するctorを作成し、。からラッパーのインスタンスを作成するctorを作成するだけuint2ですint。これらは、指定した値からラッパーのインスタンスを作成するために使用され、その一時インスタンスがターゲットに割り当てられます。コードは次のようになります。

class uint_2 {
    uint2 value;
public:
    uint_2(uint2 init) : value(init) {}
    uint_2(int init) : value(make_uint2(init)) {}

    operator uint2() { return value; }
};

特にCUDAを使用している場合、効率についての質問が発生する可能性が高いので、事前にそれらに対処します。通常の状況では、これはおそらくオーバーヘッドを課しません。__device__ただし、CUDAの状況や、上記のコードで(たとえば)使用できるかどうかについては、少し確信が持てません。私の当面の推測はおそらくそうではありませんが、正直なところ、私は本当に知りません-私はそれが新しいときに数年前に小さなCUDAコードを書きましたが、私はこれを試したことがないと確信しています。確かにルールを新しくしたことはないと思いますが、もしそうしたら、もう覚えていません。

于 2012-04-13T14:54:34.440 に答える