我应该从这个筛选代码中删除多个,这是在内核调用中,但我不知道我是否正确地执行它。每次我输入一个大于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”。
有人可以帮我这个吗?
启动时的错误9是无效的启动配置。 (您可以在the runtime API documentation或头文件driver_types.h
中发现这一点)。
值为20000000时,您的第一个内核启动参数为20000000/256,即78125,大于65535,即cc2.0设备的限制。
如果您使用的是cc3.0或更高版本的设备,请编译设备的计算功能(例如nvcc -arch=sm_30 ...
),您也许可以解决此问题。 (基于评论,这显然是这种情况。)