【问题标题】:Does memory limit MATLAB's parfor loop scaling for memory intensive problems?对于内存密集型问题,内存是否会限制 MATLAB 的 parfor 循环缩放?
【发布时间】:2015-12-12 06:35:41
【问题描述】:

我尝试在 MATLAB 中在具有 40 个内核和大量内存的机器上解决一个微不足道的可扩展问题。在大约 10 个内核之后,我发现计算时间减少了零,有时甚至会增加计算时间。

在调查此问题时,我创建了一个简单的基准测试代码,似乎可以说明问题:

clc
clear
p = gcp;
poolSize = p.NumWorkers;
M = 60;
N = 500;

t1 = zeros(1, poolSize);
for n = 1:poolSize
    tic;
        parfor(ImageInd = 1:n*M,n)
            vec1 = rand(1,N);
            vec2 = rand(N,1);
            d = sin(vec2*vec1);
        end
    t1(n) = toc;
end
figure; plot(1:poolSize,(1:poolSize)*M./t1,'b')
hold on; plot(1:poolSize,(1:poolSize)*M./t1(1),'b--')

t2 = zeros(1, poolSize);

for n = 1:poolSize
    tic;
        parfor(ImageInd = 1:n*M,n)
            vec1 = rand(1,N);
            vec2 = rand(N,1);
            d = sin(sin(vec2*vec1));
        end
    t2(n) = toc;
end
figure; plot(1:poolSize,(1:poolSize)*M./t2,'g')
hold on
plot(1:poolSize,(1:poolSize)*M./t2(1),'g--')

上面脚本中 parfor 循环的两次迭代似乎涉及相同数量的内存,但每个循环中的计算量不同(如果我是,sine 命令应该意味着更多的计算量没记错)。第二个循环的计算成本更高,可以很好地扩展更多处理器,而第一个则不行。无论我是否使用临时变量,这似乎是一致的,例如在示例中,减少变量或切片访问变量。我是否正确假设这是一个内存问题?可以通过切换到另一种编程语言或改进计算机体系结构来解决问题吗?所涉及的变量应该小于处理器的缓存,MATLAB在并行处理时没有很好地利用缓存吗?

【问题讨论】:

  • 如果您监控您的内存使用情况(例如使用 Windows 的任务管理器),您是否看到此问题正在发生?请注意:您在这里使用for 循环,而不是parfor;您在运行的测试中使用了实际的parfor 循环吗?另见this answer

标签: matlab parfor


【解决方案1】:

在并行执行中通常存在一些与移动内存、启动线程等相关的开销。最终,这种开销会淹没并行执行的好处。我怀疑这就是您的情况,尤其是因为,正如您所指出的,计算密集型版本的扩展性更好。

我不知道 parfor 在 Matlab 中实现的所有细节,但我的印象是它处理内存的方式效率不高。特别是,我认为它是在幕后复制内存,而不是“就地”访问它。如果您可以通过多线程利用共享内存模型,特别是如果您可以使用在程序开始时只启动一次的线程池,您可能会在其他语言中做得更好。

这篇文章及其后续文章有一些相关信息,包括 Matlab 内部结构和使用其他语言的解决方法。 http://undocumentedmatlab.com/blog/explicit-multi-threading-in-matlab-part1

【讨论】:

    猜你喜欢
    • 2013-07-11
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    相关资源
    最近更新 更多