1

私はCUDAが初めてで、使い方を学ぼうとしています。誰か助けてください。メイン関数には次のものがあります(私はビジュアルスタジオにいて、ソースファイルとヘッダーファイルはそれぞれ.cuと.cuhです)

 thrust::device_vector<float> d_vec(100);
 kernel<<<100,1>>>(d_vec);

そして、カーネルで私は持っています

    template <typename T> __global__ kernel(thrust::device_vector<T> d_vec)
    {  int tid = threadIdx.x + blockIdx.x*blockDim.x;
       T xxx = 3.0;
       d_vec[tid] = xxx;
     }

私の目的は、カーネルを float で 1 回、double で 1 回呼び出すことです。また、この単純な例では、変数 xxx があることに注意してください (私の実際のケースでは、倍精度または浮動小数点数を生成する計算です)。

そして、私は2つのエラーを受け取ります:1>__host__関数からの関数(演算子=)の__global__呼び出しは許可されていません2>関数からの__host__関数(演算子[])の呼び出し__global__は許可されていません

したがって、「d_vec[tid] = ..」の「[]」と「=」が問題だと思います。しかし、私の質問は、カーネル内のデバイス ベクトルにどのようにアクセスするかです。誰かが正しい手順と私が間違っていることを明確にしてください。前もって感謝します

4

1 に答える 1

5

Thrust::device_vector オブジェクト/参照は、カーネル パラメーターとして使用できません。生のポインターを使用して、デバイスのベクター データを渡すことができます。

thrust::device_vector<float> d_vec(100);
float* pd_vec = thrust::raw_pointer_cast(d_vec.data());
kernel<<<100,1>>>(pd_vec);

これがカーネルのプロトタイプです

template <typename T> __global__ kernel(T* pd_vec)

あなたのQはこれに似ています。Thrust::device_vector<int> を生のポインタにキャストする方法

于 2013-01-21T16:43:58.620 に答える