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()
-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