パラメータとしていくつかの非PODを持ち、非明示的なコンストラクタを持つカーネルにいくつかのPODを渡そうとしています。その背後にあるアイデアは次のとおりです。ホストにメモリを割り当て、メモリをカーネルに渡し、ユーザーが明示的にそのステップを実行することなく、メモリをオブジェクトにカプセル化します。
コンストラクターは __device__ コードとしてマークされていますが、パラメーターを渡すときに呼び出されず、その理由がわかりません。
私の質問は、どうすればいいのかということとは関係ありませんが、舞台裏で何が起こっているのかを理解しようとしています。
ここに例があります(機能2.1のGPUでCUDA 5を使用しているため、printfです)。
#include <stdio.h>
struct Test {
__device__ Test() {
printf("Default\n"),
_n = 0;
}
__device__ Test(int n) {
printf("Construct %d\n", n);
_n = n;
}
__device__ Test(const Test &t) {
printf("Copy constr %d\n", t._n);
_n = t._n;
}
__device__ Test &operator=(const Test &t) {
printf("Assignment %d\n", t._n);
_n = t._n;
return *this;
}
__device__ int calc() const {
printf("Calculating %d\n", threadIdx.x + 10 * _n);
return threadIdx.x + 10 * _n;
}
int _n;
};
__global__ void dosome(Test a, Test b) {
printf("Kernel data %d %d\n", a._n, b._n);
a.calc();
b.calc();
}
int main(int argc, char **argv) {
dosome<<<1, 2>>>(2, 3);
cudaError_t cudaerr = cudaDeviceSynchronize();
if (cudaerr != cudaSuccess)
printf("kernel launch failed with error:\n\t%s\n",cudaGetErrorString(cudaerr));
return 0;
}
編集: 言い忘れましたが、コンストラクタ メッセージは出力されませんが、calc とカーネル メッセージは出力されます。
EDIT2:デバイスにコピーする前にCUDA が Test オブジェクトを初期化することが保証されていますか?