【发布时间】:2013-03-23 06:30:25
【问题描述】:
我对 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;
}
【问题讨论】:
-
您应该在
each内核调用之后而不是最后检查错误。这也适用于任何 CUDA API 调用。 -
您可以尝试使用 cuda-memcheck 运行您的应用程序并发布结果吗?
标签: cuda