我是Matlab R2012b的Parallel工具箱的新手,想知道克服以下问题的最佳方法是什么。
我正在分析图像中每个像素的邻域。这是并行化的极好例子。但是,我似乎无法让它发挥作用。
问题的主要问题是应该将一些“常量”参数传递给函数。因此,应该为每个像素调用该函数,但是,它还需要访问周围的像素。 (最好将图像作为某种常量参数和要分析的像素的坐标传递)。
输出是每像素一个值。
目前我有这个:
z2 = arrayfun(@(x) analyze(x, image, const1, ...), gpuArray(1:m*n));
其中x是dummy-var,图像是包含图像亮度值的2D矩阵,const1(和其他)是函数常数(例如分析窗口的大小)。 m和n是图像尺寸的大小。
但是,我收到此错误
使用gpuArray / arrayfun时出错 不支持使用功能工作区。
有什么想法吗?
干杯, 鲁
答案 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/
最好
汉斯·马丁