我对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;
}
答案 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绝对正确,你应该在每个内核代码之后做一次错误检查,以便尽快检测错误(目前在代码中找到错误的确切位置)