在Matlab中维护CUDA内核启动之间的gpuArray数据
我正在使用parallel.gpu.CUDAKernel在Matlab2011a中启动CUDA内核。我的代码设计为相同的gpuArray应该由循环中的后续内核启动填充,但每次启动都将自身限制为gpuArray的唯一段 在执行结束时,整个数组应该已满。但是,当我使用gather()将内存传输回主机时,只有上次内核启动写入的内存是正确的;其他的都是空白。如果我在中间某个地方跳出循环,这也是事实。 我已经通过传递一个标志来指示内核迭代来验证了这一点。如果不是第一次迭代,那么内核什么也不做。但是,第一个内核写入的数据位置仍然是空的,即使后续内核什么都不做!如果我在启动第一个内核后直接跳出循环,情况就不是这样了在Matlab中维护CUDA内核启动之间的gpuArray数据,matlab,cuda,Matlab,Cuda,我正在使用parallel.gpu.CUDAKernel在Matlab2011a中启动CUDA内核。我的代码设计为相同的gpuArray应该由循环中的后续内核启动填充,但每次启动都将自身限制为gpuArray的唯一段 在执行结束时,整个数组应该已满。但是,当我使用gather()将内存传输回主机时,只有上次内核启动写入的内存是正确的;其他的都是空白。如果我在中间某个地方跳出循环,这也是事实。 我已经通过传递一个标志来指示内核迭代来验证了这一点。如果不是第一次迭代,那么内核什么也不做。但是,第一个
因此,在我看来,Matlab在内核启动之间重置gpuArray。有什么方法可以阻止它这样做吗?如果捕获feval调用的输出,应该可以这样做。考虑一个像这样的小内核:
__global__ void setOneEl( double * array, double val, int element ) {
array[element] = val;
}
然后,在MATLAB中运行以下代码,正如我相信您所追求的那样:
>> k = parallel.gpu.CUDAKernel('kern.ptx');
>> g = parallel.gpu.GPUArray.zeros(1,10);
>> for ii = 1:2:10, g = k.feval(g, rand, ii); end
>> gather(g)
ans =
0 0.0975 0 0.2785 0 0.5469 0 0.9575 0 0.9649
为了与普通的MATLAB语义保持一致,
gpuArray
对象是基于值的,因此,当您希望修改gpuArray
实例时,必须将输出值捕获回同一数组中,这与任何其他MATLAB数据类型一样。但是,请注意,CUDAKernel.feval
调用可以理解将结果捕获到同一个变量中的时间,并且可以使用就地优化来避免复制。并行计算工具箱中的gpuArray功能不强。你最好穿件夹克。虽然我有偏见,因为我工作的夹克,我不是在开玩笑,当我说你不应该浪费你的时间与gpuArray的。如果你不打算使用Jacket,最好还是坚持使用CPU或编写自己的CUDA代码。它看起来是一款很棒的产品。不幸的是,作为一名学生,我仅限于自由软件和大学提供的软件。现在我要试着写一个mex接口,听起来不错。如果您向IT部门发送通知,要求他们购买夹克,他们可能会这样做。事实上,他们可能已经有了夹克的许可证(到目前为止,大多数大学都有一些夹克许可证)。