Cuda内核启动失败

时间:2013-07-17 03:33:06

标签: visual-studio-2010 cuda nsight

我试图调用两个内核,如下所示

for (t=0; t<=time_total; t++)
{    
      //kernel calls
      kernel1<<<noOfBlocks,noOfThreadsPerBlock>>>(** SOME PARAMETERS **);
      checkCudaError(cudaThreadSynchronize());

      kernel2<<<noOfBlocks,noOfThreadsPerBlock>>>(** SOME PARAMETERS **);
      checkCudaError(cudaThreadSynchronize());

}

第二个内核的结构是

var[index+0]=**SOME CALCULATION**
var[index+1]=**SOME CALCULATION**
var[index+2]=**SOME CALCULATION**

现在,当我执行此代码时,checkCudaError不报告任何内容,代码执行时给出一些输出,但visual studio提供以下异常

First-chance exception at 0x7640c41f in **.exe: Microsoft C++ exception: cudaError_enum at memory location 0x0039f9c4..
First-chance exception at 0x7640c41f in **.exe: Microsoft C++ exception: cudaError_enum at memory location 0x0039f9c4..

当我检查Nsight时,它说内核2出现以下错误

CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES

现在问题是内核2中的var数组正在给出一些正确的行,有些是其他行值的副本,有些是垃圾。

当我这样做时

var[index+0]=3
var[index+1]=3
var[index+2]=3

var的所有值都设置为3

1 个答案:

答案 0 :(得分:0)

一些附注:

  1. cudaThreadSynchronize()已被弃用,转而使用cudaDeviceSynchronize()
  2. 事实上,nsight在第二次内核启动时报告错误,但错误检查代码没有,这让我相信您的错误检查代码已损坏。
  3. 现在,关于您的问题,资源中的资源通常是由于代码请求的寄存器太多(每个线程的寄存器数量太少,而且每个请求的每个线程块的线程数都会增加。)尝试重新编译代码specifying { {1}}获取详细输出,然后使用-Xptxas -v(或something like that)重新进行重新编译,以尝试解决此问题以进行测试。

    如果这“解决”您的问题,您可能需要考虑以下事项:

    1. 查看是否有办法重新订购或重组代码以降低注册压力
    2. 如果没有,则将-maxrregcount 20值向上调整到大约最高值,以允许代码根据您关注的启动配置(每个块的线程数)进行编译和运行。您可能还希望在此设置的不同级别对代码进行基准测试,因为它可能会影响占用率。通常,如果将其设置为将编译和运行的最高值,那么您在执行时将每个SM限制为一个线程块。这可能没问题,或者可能有更低的设置更好,每个SM驻留允许两个线程块,并且可能具有更高的性能。只有对代码进行基准测试才能证明。