删除内核调用中的倍数以获得更好的性能

时间:2017-04-13 11:21:34

标签: c++ cuda

我应该从这个筛选代码中删除多个,这是在内核调用中,但我不知道我是否正确地执行了它。每次我输入一个大于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”。

有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:1)

启动时的错误9是无效的启动配置。 (您可以在the runtime API documentation或头文件driver_types.h中)发现这一点。

值为20000000时,您的第一个内核启动参数为20000000/256,即78125,大于65535,即cc2.0设备的限制。

如果您使用的是cc3.0或更高版本的设备,请针对设备的计算功能进行编译(例如nvcc -arch=sm_30 ...),您也许可以解决此问题。 (根据评论,显然就是这种情况。)