对于内存密集型问题,内存是否会限制MATLAB的parfor循环缩放?

时间:2015-09-15 21:06:24

标签: matlab parfor

我有一个简单的可扩展问题,我试图在具有40个内核和大量内存的机器上使用MATLAB。在大约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循环的两次迭代似乎涉及相同数量的内存,但是每个循环中的计算量不同(正弦命令应该意味着一个数量级的计算,如果我&#39 ;没错。)第二个循环,计算成本越高,在使用更多处理器时可以很好地扩展,而第一个循环不能。无论我使用临时变量,如示例,减少变量还是切片访问变量,这似乎都是一致的。假设这是一个内存问题,我是否正确?可以通过切换到另一种编程语言或改进的计算机体系结构来解决问题吗?涉及的变量应该小于处理器的缓存,MATLAB在并行处理期间不能很好地利用缓存吗?

1 个答案:

答案 0 :(得分:0)

并行执行通常会有一些与移动内存,启动线程等有关的开销。最终,这种开销会影响并行执行的好处。我怀疑这是你的情况下发生的事情,特别是因为你注意到,计算密集度更高的版本可以更好地扩展。

我不知道在Matlab中parfor实现的所有细节,但我的印象是它的效率不高它处理内存。特别是,我认为它是在封面下复制内存而不是在内容中访问内存。"如果您可以通过多线程利用共享内存模型,则可以使用其他语言做得更好,特别是如果您可以使用在程序开头只启动一次的线程池。

本文及其续集有一些相关信息,包括Matlab内部和使用其他语言的变通方法。 http://undocumentedmatlab.com/blog/explicit-multi-threading-in-matlab-part1