CUDA在线程之间共享对象

时间:2013-03-22 12:47:02

标签: cuda

我对CUDA全新。我想在设备上创建一个对象,并从不同的线程访问其成员。我使用nvcc -arch = sm_20(在Tesla M2090上),如果我运行我的代码,我会得到一个'未指定的启动失败'。这是我的代码:

#include <stdio.h>
#include <string>

using namespace std;

#ifdef __CUDACC__
#define CUDA_CALLABLE __host__ __device__
#else
#define CUDA_CALLABLE
#endif

class SimpleClass {
public:
    int i;
    CUDA_CALLABLE SimpleClass(){i=1;};
    CUDA_CALLABLE ~SimpleClass(){};
};

__global__ void initkernel(SimpleClass *a){
    a = new SimpleClass();
}
__global__ void delkernel(SimpleClass *a){
    delete a;
}
__global__ void kernel(SimpleClass *a){
printf("%d\n", a->i);
}

int main() {
    SimpleClass *a;
    initkernel<<<1,1>>>(a);
    cudaThreadSynchronize();
    kernel<<<1,10>>>(a);
    cudaThreadSynchronize();
    delkernel<<<1,1>>>(a);
    cudaThreadSynchronize();

    cudaError_t error = cudaGetLastError();
    string lastError = cudaGetErrorString(error);
    printf("%s\n",lastError.c_str());
    return 0;
}

1 个答案:

答案 0 :(得分:0)

在第一个内核代码中,您会收到'未指定的启动失败',因为'a'是存储在主机中的指针,但您希望从设备函数中为其指定值。如果你想在设备上分配对象,那么首先必须在设备上分配一个指针,而不是你可以从设备(内核)代码中读取和写入它,但要小心,因为它需要双重间接。

您的代码看起来像这样(其他功能应该类似地修改):

__global__ void initkernel(SimpleClass** a){
    *a = new SimpleClass();
}

int main() {
    SimpleClass** a;
    cudaMalloc((void**)&a, sizeof(SimpleClass**));
    initkernel<<<1,1>>>(a);
    cudaThreadSynchronize();
}

PS。:pQB绝对正确,你应该在每个内核代码之后做一次错误检查,以便尽快检测错误(目前在代码中找到错误的确切位置)