预先加载数据在多个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评估呢?也许在新的版本吗?
0评论
接受的答案
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埃利斯
2021年3月17日
一件事需要注意
复合
价值观——他们不释放内存,直到工人
spmd
块后立即清除(这是为了避免过度client-worker通信)。所以,你如果你做
清晰的一个
spmd,结束
您应该看到返回的记忆。(在你的代码中,这将是CPU内存)。