CUDA内核循环数据导致应用中止导致应用中止!异常:ManagedCuda.CudaException:'ErrorLaunchFailed:执行内核时设备发生异常。常见原因包括取消引用无效的设备指针和越界访问共享内存。问题:如果有人能阐明我正在使用的当前实现的局限性以及导致应用程序崩溃的确切原因,我将不胜感激。或者,我附上了完整的内核代码,以便有人可以说出如何以这种方式改造它而不抛出异常。这个想法是内核正在进行组合,然后对同一组数据执行计算(在循环中)。因此,内循环计算应该是顺序的。内核本身的执行顺序无关紧要。这是一道组合数学题。欢迎提出任何建议。代码(简短版本,足以中止应用程序):extern"C"{__device____constant__intarraySize;__global__voidmyKernel(unsignedchar*__restrict__output,constint*__restrict__in1,constint*__restrict__in2,constdouble*__restrict__in3,constunsignedchar*__restrict__in4){for(introw=0;row=限制)返回;布尔是真=假;intvarA=in1[索引];intvarB=in2[索引];双可计算=0;对于(introw=0;row=0){output[index]=1;}}}代码–主机(完整版)publicstaticvoidtest(){intN=10_245_456;//输出的大小CudaContextcntxt=newCudaContext();CUmodulecumodule=cntxt.LoadModule(@"kernel.ptx");Cuda内核我的Kernel=newCudaKernel("myKernel",cumodule,cntxt);myKernel.GridDimensions=(N+255)/256;myKernel.BlockDimensions=Math.Min(N,256);//输出byte[]out_host=newbyte[N];//即boolvarout_dev=newCudaDeviceVariable(out_host.Length);//输入int[]in1_host=newint[N];int[]in2_host=newint[N];double[]in3_host=newdouble[50_000];//改成10k就可以了byte[]in4_host=newbyte[10_000_000];//即boolvarin1_dev=newCudaDeviceVariable(in1_host.Length);varin2_dev=newCudaDeviceVariable(in2_host.Length);varin3_dev=newCudaDeviceVariable(in3_host.Length);varin4_dev=newCudaDeviceVariable(in4_host.Length);//复制输入参数in1_dev.CopyToDevice(in1_host);in2_dev.CopyToDevice(in2_host);in3_dev.CopyToDevice(in3_host);in4_dev.CopyToDevice(in4_host);myKernel.SetConstantVariable("宽度",2);myKernel.SetConstantVariable("limit",N);myKernel.SetConstantVariable("arraySize",in3_host.Length);//电子这里抛出xceptionmyKernel.Run(out_dev.DevicePointer,in1_dev.DevicePointer,in2_dev.DevicePointer,in3_dev.DevicePointer,in4_dev.DevicePointer);out_dev.CopyToHost(out_host);}分析我最初的假设是我有内存问题,然而,根据VS调试器,我在主机环境上的数据量超过500mb,所以我想,无论我向GPU复制多少数据-它都不应该超过1Gb甚至11Gb。后来发现,只有当内核中的循环有很多数据记录要处理时,才会发生崩溃。这让我相信我正在达到某种线程超时限制或其他什么。没有确凿的证据。系统我的系统规格是16GbRam和GeForce1080Ti11Gb。使用Cuda9.1.和managedCuda版本8.0.22(也尝试了master分支的9.x版本)编辑1:26.04.2018刚刚测试了相同的逻辑,但仅适用于OpenCL。代码不仅成功完成,而且执行时间比CUDA长1.5-5倍,具体取决于输入参数大小:kernelvoidTest(globalbool*output,globalconstint*in1,globalconstint*in2,globalconstdouble*in3,globalconstbool*in4,constintwidth,constintarraySize){intindex=get_global_id(0);布尔是真=假;intvarA=in1[索引];intvarB=in2[索引];双可计算=0;对于(introw=0;row=0){output[index]=true;我真的不想在这里开始OpenCL/CUDA战争。如果在我最初的CUDA实现中有什么我应该关心的——请告诉我。编辑:26.04.2018。在遵循评论部分的建议后,我能够在抛出异常之前将处理的数据量增加3倍。我能够通过切换到在发布模式而不是调试模式下生成的.ptx来做到这一点。这一改进可能与我们在Debug设置中还将GenerateGPUDebuginformation设置为Yes以及其他可能影响性能的不必要设置有关。我现在将尝试搜索有关如何增加内核计时的信息。我还没有得到OpenCL结果,但越来越接近了。对于CUDA文件生成,我使用VS2017社区、CUDA9.1项目、v140工具集、为x64平台构建、禁用构建后事件、配置类型:实用程序。代码生成设置为:compute_30,sm_30。例如,我不确定为什么它不是sm_70。我别无选择。我已经设法通过OpenCL提高了CUDA性能。更重要的是,代码现在无一例外地完成了执行。致谢罗伯特·克罗维拉(RobertCrovella)。谢谢!在显示结果之前,这里有一些规格:这是我的结果(图书馆/技术):解决方案1:解决方案是将WDDMTDR延迟从默认的2秒增加到10秒。就这么简单。解决方案2:我能够通过以下方式获得更多性能:在CUDA项目属性中将compute_30、sm_30设置更新为compute_30、sm_30使用Release设置而不是Debug使用.cubin文件而不是.ptx如果有人仍然想建议关于如何进一步提高性能的一些想法-请分享!我很高兴。不过,这个问题已经解决了!附:如果您的显示器以与此处描述的方式相同的方式闪烁,请尝试增加延迟。以上是C#学习教程:回收CUDA内核中的数据会导致应用程序停止共享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: