1

我遇到的问题是编写代码,以便 Matlab 的 GPU 编程的内置功能将正确划分数据以进行并行执行。具体来说,我将 N 个“粒子”图像发送到 GPU 的内存,组织在一个 3-d 数组中,第三维代表每个图像,并尝试将 N 个图像中的每一个与一个代表目标的图像进行比较,也在 GPU 内存中。

我当前的实现,实际上或多或少是我希望看到它实现的方式,是用一行代码:

particle_ifft = ifft2(particle_fft.*target_fft);

请注意,这是在对每个上传的图像进行 fft 之后。这就是索引问题:该语句需要相同大小的“particle_fft”和“target_fft”矩阵才能使用“.*”运算符。为了与每个粒子图像进行比较,具有相同目标图像的多个副本在内存使用方面效率低下。我使用这种低效的方法来获得良好的性能结果,但它显着影响了我可以上传到 GPU 的粒子图像的数量。

有没有一种方法可以告诉 matlab 将粒子图像 3d 数组(每个图像)的每个 2d 元素与单个目标图像进行比较?

我尝试使用 for 循环来索引 3d 数组并单独访问每个粒子图像以与单个目标进行比较,但 Matlab 不会在 GPU 上并行化此类操作,即它的运行速度比等效代码慢近 1000 倍使用内存效率低的目标数组。

我意识到我可以编写自己的内核来解决这个索引问题,但我有兴趣找到一种利用 matlab 现有功能的方法(特别是不重写 fft2 和 ifft2 函数)。想法?

4

1 回答 1

0

In Parallel Computing Toolbox release R2012a, bsxfun was added - I think that's what you need, i.e.

bsxfun(@times, particle_fft, target_fft);

See: http://www.mathworks.co.uk/help/toolbox/distcomp/bsxfun.html

于 2012-05-11T06:58:12.830 回答