我有一个包含大约2000个数字图像的数据集。我正在使用MATLAB执行一些数字图像处理以从图像中提取树。该脚本当前配置为在 n 核心上的parfor
循环中处理图像。
挑战:
我可以访问具有大约10,000个计算核心的大学管理的超级计算机上的处理时间。如果我提交整个作业进行处理,我会把它放到任务队列中,台式计算机可以在超级计算机上开始处理之前完成这项工作。支持人员告诉我,将2000文件数据集划分为~100个文件作业将显着减少任务队列时间。使用parfor
循环可以使用什么方法并行执行任务,同时一次提交100个文件(2000个)?
我的脚本按以下方式构建:
datadir = 'C:\path\to\input\files'
files = dir(fullfile(datadir, '*.tif'));
fileIndex = find(~[files.isdir]);
parfor ix = 1:length(fileIndex)
% Perform the processing on each file;
end
答案 0 :(得分:1)
与我的评论相似,我会自发地提出类似
的建议datadir = 'C:\path\to\input\files'
files = dir(fullfile(datadir, '*.tif'));
files = files(~[files.isdir]);
% split up the data
N = length(files); % e.g. 20000
jobSize = 100;
jobFiles = mat2cell(files, [jobSize*ones(1,floor(N/jobSize)), mod(N,jobSize)]);
jobNum = length(jobFiles);
% Provide each job to a worker
parfor jobIdx = 1:jobNum
thisJob = jobFiles{jobIdx}; % this indexing allows matlab for transfering
% only relevant file data to each worker
for fIdx = 1:length(thisJob)
thisFile = thisJob(fIdx);
% Perform the processing on each file;
thisFile.name
end
end
答案 1 :(得分:1)
让我尝试回答更高级别的作业分区问题,以优化超级计算机队列。我发现一个好的经验法则是在具有p个处理器的机器上提交大小为sqrt(p)的作业,如果目标是最大化吞吐量。当然,这假定了一个相对平衡的队列策略,并未在所有站点上实现。但是大多数大学都没有像DOE设施那样优先考虑大型工作,所以这个规则应该适合你的情况。
我的经验法则背后没有数学理论,但过去8年来我一直是大型DOE超级计算机用户(个人100M +小时,500M +的分配所有者)我在美国能源部网站之一的工作人员直到最近才开始工作(尽管有一个队列政策违反我的规定)。