0

我有一个数据集,其中包含大约 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
4

2 回答 2

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
于 2014-05-29T06:28:36.053 回答
1

让我尝试回答作业分区以优化超级计算机队列的更高级别的问题。如果目标是最大化吞吐量,我发现一个好的经验法则是在具有 p 个处理器的机器上提交大小为 sqrt(p) 的作业。当然,这假设了一个相对平衡的队列策略,并非在所有站点都实施。但是大多数大学并不像 DOE 设施那样优先考虑大型工作,所以这条规则应该适用于你的情况。

我的经验法则没有数学理论,但在过去的 8 年里,我一直是 DOE 超级计算机的大型用户(个人 1 亿多小时,分配所有者 5 亿多小时),我曾在 DOE 的一个站点工作直到最近(尽管它的队列策略违反了我的规则)。

于 2015-01-05T05:57:02.697 回答