【发布时间】:2013-08-08 12:15:01
【问题描述】:
在修复了我发布的代码here(将 *sizeof(float) 添加到共享内存分配中 - 但没关系,因为这里我通过 MATLAB 分配共享内存),我运行了代码,它成功返回了结果大小最大为 sizeof(float)*18*18*5000*100 字节。
我拿了 PTX,并用它通过 MATLAB 运行代码 (它找到了正确的入口点——我想运行的函数)
kernel=parallel.gpu.CUDAKernel('Tst.ptx','float *,const float *,int');
mask=gpuArray.randn([7,7,1],'single');
toConv=gpuArray.randn([12,12,5],'single'); %%generate random data for testing
setConstantMemory(kernel,'masks',mask); %%transfer data to constant memory.
kernel.ThreadBlockSize=[(12+2*7)-2 (12+2*7)-2 1];
kernel.GridSize=[1 5 1]; %%first element is how many convolution masks
%%second one is how many matrices we want to convolve
kernel.SharedMemorySize=(24*24*4);
foo=gpuArray.zeros([18 18 5 1],'single'); %%result size
foo=reshape(foo,[numel(foo) 1]);
toConv=reshape(toConv,[numel(toConv) 1]);
foo=feval(kernel,foo,toConv,12);
我明白了:
使用 parallel.gpu.CUDAKernel/feval 时出错 发生意外错误 试图启动内核。 CUDA 错误是: CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES
tst 中的错误(第 12 行)foo=feval(kernel,foo,toConv,12);
这样一个小例子的资源不足?它在 Visual Studio 中解决了十万倍大的问题...
我有 GTX 480(计算 2.0,大约 1.5 GB 内存,每块最大 1024 个线程,48K 共享内存)
1> ptxas : info : 0 bytes gmem, 25088 bytes cmem[2]
1> ptxas : info : Compiling entry function '_Z6myConvPfPKfi' for 'sm_21'
1> ptxas : info : Function properties for _Z6myConvPfPKfi
1> 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
1> ptxas : info : Used 10 registers, 44 bytes cmem[0]
编辑:通过使用 Configuration Active(Release) 和 Platform Active(x64) 编译解决了问题
【问题讨论】:
-
CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES表示您对每个线程或每个块的资源(如寄存器、本地内存或共享内存)要求太多。您能否编辑您的问题以包含使用-Xptxas="-v"作为 nvcc 选项编译内核的输出,并告诉我们您拥有什么 GPU?请注意,Matlab 正在从 PTX 为您编译内核,这两种不同编译轨迹发出的最终代码之间可能存在差异。 -
另请注意,您链接到的指南显示了如何询问 Matlab 内核结构以查看内核属性(例如,我会特别注意 MaxThreadsPerBlock 的值)。
-
按您的要求编辑。而且我知道 MATLAB 会向我展示信息 - 我将所有信息牢记在心。请注意,当我尝试通过 MATLAB 运行代码时,我在常量内存中占用的空间比通过 Visual Studio 使用的要少。每个线程的共享内存使用量保持不变,但仍远低于最大值。分配所有变量后出现错误,并且由于我使用的小尺寸,它不可能超出全局内存。
-
这与内存无关。它很可能是每个块的线程,并且可能是因为您提供给 Matlab 的 PTX 与您在 VS 中编译为二进制文件的代码之间存在差异。 CUDA 工具链的默认架构仅支持每个块 512 个线程。如果您已将内核编译为 PTX 1.x,则 Matlab 将尝试运行的生成代码可能会限制为 512 个线程。您正在尝试运行 576。您报告的错误与此一致。
-
不要将解决方案编辑到您的问题中。将其添加为答案(这里完全可以)。稍后您将能够接受您自己的答案,这表明该问题已得到回答并将其从未回答的问题列表中删除。