预先加载数据在多个gpu parfor循环

4视图(30天)
我有两个gpu 6 Gb的RAM。
我需要执行一个粒子群优化评估一个成本函数,非常适合GPU的计算,但是数据数组是巨大的(~ 4 Gb)。
我已经成功的代码使用一个GPU和并行工作。预载入的代码数组到GPU(耗时),随后进入优化流程,成本函数的快速评估。
现在,我想利用第二个GPU,但是我需要开始一个平行池2工人,和分配一个GPU。问题是预装载的数组。
我已经尝试了不同的选项,还建议在MATLAB的博客、文档和答案,但他们不工作。
例如:
%创建一个4 Gb的数组
一个=兰德(1024、1024、512);
spmd
%将数组复制到每个工人和负载在各自的GPU
% 2 x1综合结果
= gpuArray ();
结束
%为每一个潜在的解决方案来评估
parforn = 1: n
%计算成本函数(*)
< . .> = costFunction (n . .);
结束
将抛出一个错误(*),因为“ 复合材料中不支持parfor循环万博1manbetx ”。由于粒子群使用 parfor ,我不能走这条路。
唯一的其他工人们是通过一个预先加载数据 parallel.pool.Constant ,但是:
  • 它不工作有意义gpuArray(至少在我的2020年版本)。
  • 这是一些奇怪的包装没有完全结合MATLAB语言(一切都改变了<变量> value这迫使你去有两个版本的代码,一个用于并行,non-parallelized计算)。
特别是:
一个=兰德(1024、1024、512);
= parallel.pool.Constant ();
spmd
%将回组合中,击败了目的
一个= gpuArray (A.Value);
结束
和:
一个=兰德(1024、1024、512);
%负载的一个主线程的gpu,占据4 Gb的RAM
= gpuArray ();
%一个复制到每个工人和负载在其各自的GPU (*)
= parallel.pool.Constant ();
将抛出内存不足(*)因为一个GPU已经4 Gb的主线程。加上它存在内存泄漏,离开原来的 gpuArray 从主线程GPU即使所有引用了。
有办法预装大量数组到每个GPU和运行parfor评估呢?也许在新的版本吗?

接受的答案

Edric埃利斯
Edric埃利斯 2021年3月16日
你有大量的选项取决于您可以构建的价值 一个 直接在工人。最简单的情况是,你可以这样做,然后你会这样做:
Ac = parallel.pool.Constant(@()兰德(1024,1024,512,“gpuArray”));
parfor……
doStuff (Ac.Value);
结束
如果情况有些棘手 一个 必须在客户端计算。但它应该工作要做:
一个=兰德(1024、1024、512);
Ac = parallel.pool.Constant (@ () gpuArray (A));
在这种情况下,CPU的价值 一个 是嵌在匿名函数处理工作区,就推到GPU只在工人们评估函数处理时。
2的评论
Edric埃利斯
Edric埃利斯 2021年3月17日
一件事需要注意 复合 价值观——他们不释放内存,直到工人 spmd 块后立即清除(这是为了避免过度client-worker通信)。所以,你如果你做
清晰的一个
spmd,结束
您应该看到返回的记忆。(在你的代码中,这将是CPU内存)。

登录置评。

更多的答案(0)

标签

s manbetx 845


释放

R2020a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!