1

在修复了我在这里发布的代码之后(将 *sizeof(float) 添加到共享内存分配中 - 但没关系,因为我在这里通过 MATLAB 分配共享内存),我运行了代码,它成功返回了 sizeof(浮动)*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)

4

1 回答 1

1

Configuration Active(Release)通过使用而不是默认编译解决了问题Platform Active(x64)(由于向后兼容性,我猜这与 x64 无关,而与编译发布而不是调试有关)

于 2013-08-07T16:59:10.443 回答