Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CUDA在尝试通过MATLAB启动时资源不足_Matlab_Cuda_Gpgpu - Fatal编程技术网

CUDA在尝试通过MATLAB启动时资源不足

CUDA在尝试通过MATLAB启动时资源不足,matlab,cuda,gpgpu,Matlab,Cuda,Gpgpu,在修复了我发布的代码之后(将*sizeof(float)添加到共享内存分配中——但这并不重要,因为我在这里通过MATLAB分配共享内存),我运行了代码,它成功地返回了大小为sizeof(float)*18*18*5000*100字节的结果 我使用PTX,并使用它通过MATLAB运行代码 (它找到了正确的入口点——我想要运行的函数) 我得到: 使用parallel.gpu.CUDAKernel/feval时出错发生意外错误 正在尝试启动内核。CUDA错误是: CUDA\u错误\u启动\u资源不足\

在修复了我发布的代码之后(将*sizeof(float)添加到共享内存分配中——但这并不重要,因为我在这里通过MATLAB分配共享内存),我运行了代码,它成功地返回了大小为sizeof(float)*18*18*5000*100字节的结果

我使用PTX,并使用它通过MATLAB运行代码 (它找到了正确的入口点——我想要运行的函数)

我得到:

使用parallel.gpu.CUDAKernel/feval时出错发生意外错误 正在尝试启动内核。CUDA错误是: CUDA\u错误\u启动\u资源不足\u

tst(第12行)中的错误foo=feval(内核,foo,toConv,12)

这样一个小例子的资源不足?它在Visual Studio中解决了一个比它大十万倍的问题

我有GTX 480(计算2.0,大约1.5 GB内存,每个块最多1024个线程,48K共享内存)


编辑:通过使用
配置激活(发布)
平台激活(x64)
而不是默认值编译
配置激活(发布)
平台激活(x64)
解决问题(由于向后兼容性,我猜这与x64的关系不大,与编译用于发行版而不是调试有关)

通过使用
配置活动(发行版)
平台活动(x64)
代替默认值进行编译,问题得以解决(由于向后兼容,我猜这与x64无关,而与编译发布版无关,与调试无关)

CUDA\u ERROR\u LAUNCH\u OUT\u资源
意味着每个线程或每个块的资源(寄存器、本地内存或共享内存)太多。您是否可以编辑您的问题以包含使用
-Xptxas=“-v”编译内核的输出
作为nvcc的一个选项,并告诉我们您有什么GPU?请注意,Matlab是从PTX为您编译内核的,两种不同编译轨迹发出的最终代码可能有所不同。另外请注意,您链接到的指南显示了如何查询Matlab内核结构以查看内核el属性(例如,我会仔细注意MaxThreadsPerBlock的值)。按照您的要求进行编辑。我知道MATLAB向我显示了信息-我记住了所有信息。请注意,当我试图通过MATLAB运行代码时,我在恒定内存中占用的空间比通过Visual studio使用的要少。每个线程的共享内存使用量保持不变,并且仍然远低于最大值。错误出现在所有变量的位置,以及我使用的小尺寸,它不可能超出全局内存。这与内存无关。它很可能是每个块的线程数,可能是因为您提供给Matlab的PTX和内部编译为二进制的代码与CUDA工具链的默认体系结构sup之间存在差异每个块端口512个线程。如果您已将内核编译为PTX 1.x,Matlab将尝试运行的结果代码可能限制为512个线程。您正在尝试运行576。您报告的错误与此一致。不要将解决方案编辑到您的问题中。将其添加为答案(此处完全可以)。稍后,您将能够接受自己的答案,这表明问题已得到回答,并将其从未回答的问题列表中删除。
CUDA\u ERROR\u LAUNCH\u OUT\u OF\u RESOURCES
意味着您对每个线程或每个块资源(因此寄存器、本地内存或共享内存)的要求太多。您是否可以编辑您的问题以包含使用
-Xptxas=“-v”编译内核的输出
作为nvcc的一个选项,并告诉我们您有什么GPU?请注意,Matlab是从PTX为您编译内核的,两种不同编译轨迹发出的最终代码可能有所不同。另外请注意,您链接到的指南显示了如何查询Matlab内核结构以查看内核el属性(例如,我会仔细注意MaxThreadsPerBlock的值)。按照您的要求进行编辑。我知道MATLAB向我显示了信息-我记住了所有信息。请注意,当我试图通过MATLAB运行代码时,我在恒定内存中占用的空间比通过Visual studio使用的要少。每个线程的共享内存使用量保持不变,并且仍然远低于最大值。错误出现在所有变量的位置,以及我使用的小尺寸,它不可能超出全局内存。这与内存无关。它很可能是每个块的线程数,可能是因为您提供给Matlab的PTX和内部编译为二进制的代码与CUDA工具链的默认体系结构sup之间存在差异每个块端口512个线程。如果您已将内核编译为PTX 1.x,Matlab将尝试运行的结果代码可能限制为512个线程。您正在尝试运行576。您报告的错误与此一致。不要将解决方案编辑到您的问题中。将其添加为答案(此处完全可以)。稍后,您将能够接受自己的答案,这表明问题已得到回答,并将其从未回答问题列表中删除。感谢您这样做-这使那些“策展人”的生活更轻松CUDA标记。调试版本可能是密钥寄存器,当您为调试而构建时,本地内存消耗会发生很大变化。感谢您这样做,它使那些“管理”CUDA标记的人的生活更加轻松。调试版本可能是密钥寄存器,当您为调试而构建时,本地内存消耗会发生很大变化。
    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);
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]