Cuda内核启动失败



我正在尝试调用两个内核,如下所示

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不会报告任何内容,并且执行该代码时会给出一些输出,但visualstudio会给出以下异常

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. CCD_ 1被弃用而支持CCD_ 2
  2. nsight在第二次内核启动时报告了一个错误,但您的错误检查代码没有,这让我相信您的错误检测代码已经损坏

现在,关于您的问题,资源不足通常是由于代码请求了太多寄存器(每个线程请求的寄存器太多乘以每个线程块请求的线程数。)请尝试重新编译指定-Xptxas -v的代码以获得详细输出,然后使用-maxrregcount 20(或类似的东西)重新编译以尝试解决此问题以进行测试。

如果这"解决"了你的问题,你可能需要考虑以下几点:

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

最新更新