我最近在CUDA中发现了奇怪的行为。事实证明,当结构(或类)中有一个复制构造函数时,传递该结构(类)的实例将失败。看看下面的代码:
struct Test
{
float value1;
float value2;
Test() {}
};
__global__ void testit(Test value, Test* data)
{
data[0].value1 = value.value2;
}
void KKK::doit2(void)
{
Test* data_host;
Test* data_dev;
data_host = (Test*)malloc(sizeof(Test));
cudaMalloc((void**)&data_dev, sizeof(Test));
Test t;
t.value1 = 5.0f;
t.value2 = 10.0f;
dim3 blocksNum(1, 1);
int threadsPerBlock = 1;
testit<<<blocksNum, threadsPerBlock>>>(t, data_dev);
cudaMemcpy(data_host, data_dev, sizeof(Test), cudaMemcpyDeviceToHost);
printf("%f\n", data_host[0].value1);
}
它完美无缺。打印输出10.0。但是,如果您将一个复制构造函数添加到Test类:
__device__ Test(const Test& t)
{
value1 = t.value1;
value2 = t.value2;
}
程序将打印0.0。为什么会这样?有趣的是,当我删除__device__
限定符时,它可以正常工作。