我遇到的问题是编写代码,使得Matlab的GPU编程的内置功能将正确划分数据以进行并行执行。具体来说,我将N'粒子'图像发送到GPU的内存,以3维阵列组织,第三维代表每个图像,并尝试将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函数)。想法?
答案 0 :(得分:0)
在Parallel Computing Toolbox release R2012a中添加了bsxfun
- 我认为这就是你所需要的,即
bsxfun(@times, particle_fft, target_fft);
请参阅:http://www.mathworks.co.uk/help/toolbox/distcomp/bsxfun.html