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

问题描述 投票:-2回答:1

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

有人可以帮我这个吗?

c++ cuda
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.