Visual studio 2010 Cuda内核启动失败

Visual studio 2010 Cuda内核启动失败,visual-studio-2010,cuda,nsight,Visual Studio 2010,Cuda,Nsight,我试图调用两个内核,如下所示 for (t=0; t<=time_total; t++) { //kernel calls kernel1<<<noOfBlocks,noOfThreadsPerBlock>>>(** SOME PARAMETERS **); checkCudaError(cudaThreadSynchronize()); kernel2<<<noOfBlocks

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

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

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

}
现在,当我执行这段代码时,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。注意:

  • cudaThreadSynchronize()
    被弃用,取而代之的是
    cudaDeviceSynchronize()
  • nsight在第二次内核启动时报告了一个错误,但您的错误检查代码没有,这一事实让我相信您的错误检查代码被破坏了 现在,关于您的问题,资源不足通常是由于代码请求的寄存器太多(每个线程的寄存器太多,乘以每个线程块请求的线程数)。请尝试重新编译代码
    -Xptxas-v
    ,以获得详细的输出,然后使用
    -maxrregcount 20
    重新编译(或)为了测试目的,尝试解决此问题

    如果这个“修复”了你的问题,那么你可以考虑以下内容:

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

  • 最好给出完整的代码。。这样我们就可以编译、运行和检查问题了对不起,我不能在这里生成代码。。我只是想知道异常的原因是什么,如果内核启动失败,这到底意味着什么?我已经投票决定关闭它。如果你不向这里的其他人提供必要的信息来帮助你,我看不出你怎么能指望任何人给你提供答案。你可以忽略第一次机会的例外。“第一次机会异常”表示CUDA运行时库中生成的异常。异常是在CUDA库中捕获和处理的,因此无需担心,这只是正常行为(在CUDA 5.5中已修复)。这与启动失败无关。
    cudaThreadSynchronize()
    被弃用,取而代之的是
    cudaDeviceSynchronize()
    。nsight在第二次内核启动时报告了一个错误,但您的错误检查代码没有,这一事实让我相信您的错误检查代码被破坏了。资源不足通常是由于代码请求的寄存器太多(每个线程的寄存器太多,乘以请求的线程数)。请尝试重新编译代码,指定
    -Xptxas-v
    ,以获得详细的输出,然后使用
    -maxregcount 20
    (或类似的内容)重新编译代码为了测试目的,尝试解决此问题。
    var[index+0]=3
    var[index+1]=3
    var[index+2]=3