0

我对 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;
}
4

1 回答 1

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 是绝对正确的,您应该在每个内核代码之后进行错误检查以尽快检测到错误(目前是为了在代码中找到错误的确切位置)

于 2013-03-22T22:30:25.233 回答