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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除内核调用中的倍数以获得更好的性能相关的知识,希望对你有一定的参考价值。

我应该从这个筛选代码中删除多个,这是在内核调用中,但我不知道我是否正确地执行它。每次我输入一个大于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 ...),您也许可以解决此问题。 (基于评论,这显然是这种情况。)

以上是关于删除内核调用中的倍数以获得更好的性能的主要内容,如果未能解决你的问题,请参考以下文章

SparkSQL 中的表连接顺序以获得更好的性能

避免使用 CORS 预检选项以获得更好的性能

我是不是需要在代码而不是 IB 中调整下载图像的大小以获得更好的性能?

我的 setInterval 函数减慢了我的代码速度——我怎样才能修改它以获得更好的性能?

我应该将 let 值从 for 循环中取出以获得更好的性能吗?

Django South:结合“alter table”以获得更好的性能?