【发布时间】: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