如何将数据集分成n个块以减少超级计算机上的队列时间?

时间:2014-05-28 18:51:44

标签: matlab parallel-processing parfor supercomputers

我有一个包含大约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

2 个答案:

答案 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 +的分配所有者)我在美国能源部网站之一的工作人员直到最近才开始工作(尽管有一个队列政策违反我的规定)。