使用GPU加速的arrayfun中的匿名函数(Matlab)

时间:2012-11-05 16:43:59

标签: matlab cuda gpu anonymous-function

我是Matlab R2012b的Parallel工具箱的新手,想知道克服以下问题的最佳方法是什么。

我正在分析图像中每个像素的邻域。这是并行化的极好例子。但是,我似乎无法让它发挥作用。

问题的主要问题是应该将一些“常量”参数传递给函数。因此,应该为每个像素调用该函数,但是,它还需要访问周围的像素。 (最好将图像作为某种常量参数和要分析的像素的坐标传递)。

输出是每像素一个值。

目前我有这个:

z2 = arrayfun(@(x) analyze(x, image, const1, ...), gpuArray(1:m*n));

其中x是dummy-var,图像是包含图像亮度值的2D矩阵,const1(和其他)是函数常数(例如分析窗口的大小)。 m和n是图像尺寸的大小。

但是,我收到此错误

  

使用gpuArray / arrayfun时出错   不支持使用功能工作区。

有什么想法吗?

干杯, 鲁

2 个答案:

答案 0 :(得分:2)

不幸的是,R2012b中的Parallel Computing Toolbox不支持此功能。 arrayfun的gpuArray版本目前不支持将常量数据绑定到匿名函数句柄。必须直接传递Arrayfun参数,并且所有参数都必须是标量或相同的大小。

如果你可以在常量参数中绑定,接下来会发现你当前无法索引它们(或者对它们执行任何非标量操作)。

也许您可以使用受支持的例程(例如CONV2或FILTER2)来构建算法。

答案 1 :(得分:0)

这是一篇非常古老的文章,但是由于我一直在努力解决类似的问题,所以我想分享一下我发现的内容:

如果将对arrayfun的调用放在一个函数中,则可能可以将analyze函数实现为可访问常量数组的嵌套函数。但是,这可能需要花费很多精力来重写代码,因为在嵌套analyze函数中,您无法将任何完整数组传递给任何其他函数,这意味着您必须以仅使用单个索引的方式重写所有内容。常量数组的数组条目,例如在数组的for循环中。因此,所有对size等函数的调用将无法正常工作,应将其移至analyze之外(至少我正在使用的Matlab2015b就是这种情况)。 这是一个如何完成此操作的示例(不是我的):

https://devblogs.nvidia.com/high-performance-matlab-gpu-acceleration/

最好

汉斯·马丁