将gpuarray分配给不同的图形卡

8个视图(过去30天)
RWS
RWS 2020年2月19日
在下面的示例中,我使用parfor循环将不同的256x256x256(随机k空间)矩阵分配给我的2个GPU中的每个GPU。理论上,我可以在2个GPU上并行处理这些矩阵(这里我做了一个ifftn)。问题是parfor循环非常慢(可能与开销有关)。在我的机器上执行此操作需要6.5秒。如果我将“parfor”替换为简单的“for”(并按顺序运行1个GPU),则此操作需要0.2秒。
是否有一种简单(快速)的方法将gpuArray分配给特定的图形卡,以便将来在此gpuArray上的操作将使用指定的图形卡?与使用parfor相比,我更喜欢简单地使用异步CUDA内核(在Matlab代码中直接调用一个紧跟另一个的内核)并行运行两个gpu。
Dims=[256256,2];
K空间=复杂(兰特(Dims,“单身”),兰特(Dims,“单身”));
图像=gpuArray(复数)(零(Dims,“单身”)));
抽搐
帕弗n=1:2
gKspace=gpuArray(Kspace(:,:,:,n));
图像(:,:,:,n)=ifftn(fftshift(gKspace));
终止
toc

公认的答案

乔斯骑士
乔斯骑士 2020年2月22日
没有办法按你的要求去做。选择GPU是将数据移动到该位置的唯一方法,选择GPU将重置所有GPU数据。
这里的问题是如何将所有数据发送给每个工作人员,然后对其进行索引,这是您的瓶颈(相当于,将所有结果移回)。您需要摊销此通信成本,方法是在循环内进行更多工作,或者直接将所需数据加载到每个工作人员,而不首先将其加载到客户端。
大概您有2个以上的256^3阵列。把另一个循环放在你的 帕弗 并一起处理所有这些数组。将结果移回CPU以节省GPU内存。最终,通信开销将变得无关紧要,您将看到两个GPU的使用收益。
6评论

登录以发表评论。

更多答案(0)

标签

s manbetx 845

社区寻宝

在MATLAB Central中查找宝藏,了解社区如何帮助您!

开始打猎吧!