我正在尝试将一些 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 对象?