我有一个matlab脚本(称为MyProcessing.m
),它根据一些随机数进行一些计算。现在我有一个固定的种子来得到相同的随机数序列。我想并行运行这个脚本多次,以利用系统上可用的多个内核。我希望每个新的"进程"都从一个不同的(但暂时固定的)种子开始。下面是处理文件,因为它是现在。
脚本中有一个for循环,但我不能使用parfor
,因为每次迭代都依赖于前一次。
MyProcessing.m
rng(1);
A = rand(5,5);
x =[];
y = []
% for loop
% that updates x and y when necessary
% end for
figure(1);
scatter(x, y);
savefig(filename);
我可以访问MATLAB中的并行计算工具箱,但我无法想到我应该做什么。我认为我必须编写另一个脚本来调用处理脚本与不同的随机种子,但我也希望不同的进程并行运行,以便我可以运行许多实验。
编辑:我想要像
这样的东西for i = 1:numberOfParallelProcesses
startANewRunOfTheScript();
end
for循环开始进程,然后它不等待,而是继续开始下一个。
您可以使用batch
来实现这一点。你可以这样做:
for idx = 1:n
job(idx) = batch('MyProcessing');
end
您可以稍后使用job
的每个元素的load
方法获取结果:
for idx = 1:n
wait(job(idx)); % wait for results to arrive
out{idx} = load(job(idx));
end
文档中有更多关于批处理的信息。
对于matlab中令人尴尬的并行问题,到目前为止最简单的解决方案是启动多个matlab实例并在每个实例上运行脚本(当您开始每个实例时,显然会在随机种子上向前迭代)。我曾经在一个40核的服务器上使用过这个简单的技术。唯一的限制是你的系统内存。使用一些试验和错误来找到获得最大吞吐量所需的实例数量。