如果存在复制构造函数,则将结构/类实例传递给内核不起作用

时间:2011-12-18 17:23:29

标签: cuda

我最近在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__限定符时,它可以正常工作。

0 个答案:

没有答案