我应该从这个筛选代码中删除多个,这是在内核调用中,但我不知道我是否正确地执行了它。每次我输入一个大于20000000的值时,它都会给我这个错误:
Prime Sieve v1.0 [CUDA]
计算最高但不包括20000000的素数 =========关于CUDA API调用cudaLaunch的程序命中错误9 =========保存的主机回溯到错误的驱动程序入口点
=========主机框架:/usr/lib64/nvidia/libcuda.so [0x2eeda3]
=========主机框架:./ sieve_cuda [0x3b27e]
=========主机框架:./ sieve_cuda [0x2e34]
=========主机框架:/lib64/libc.so.6(__libc_start_main + 0xfd)
[0x1ed1d]
=========主机框架:./ sieve_cuda [0x2639]
这是我内核调用的代码:
static __global__ void SieveComputeKernel(const long top, bool array[])
{
const int idx = threadIdx.x + blockIdx.x * blockDim.x;
if ((idx >= 2) && (idx * idx < top))
{
int j = idx * idx;
while (j < top)
{
array[j] = false;
j += idx;
}
}
// ... //todo: remove multiples here
}
这是我的内核电话:
SieveComputeKernel<<<(sqrt_top + ThreadsPerBlock - 1) / ThreadsPerBlock,
ThreadsPerBlock>>>(top, array_d);
其中ThreadsPerBlock为256,top为该数字“2000000”。
有人可以帮我这个吗?
答案 0 :(得分:1)
启动时的错误9是无效的启动配置。 (您可以在the runtime API documentation或头文件driver_types.h
中)发现这一点。
值为20000000时,您的第一个内核启动参数为20000000/256,即78125,大于65535,即cc2.0设备的限制。
如果您使用的是cc3.0或更高版本的设备,请针对设备的计算功能进行编译(例如nvcc -arch=sm_30 ...
),您也许可以解决此问题。 (根据评论,显然就是这种情况。)