Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何将数据集划分为n个块以减少超级计算机上的排队时间?_Matlab_Parallel Processing_Parfor_Supercomputers - Fatal编程技术网

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

Matlab 如何将数据集划分为n个块以减少超级计算机上的排队时间?,matlab,parallel-processing,parfor,supercomputers,Matlab,Parallel Processing,Parfor,Supercomputers,我有一个数据集,其中包括大约2000个数字图像。我正在使用MATLAB进行一些数字图像处理,从图像中提取树木。脚本当前配置为在n个核心上的parfor循环中处理图像 挑战: 我可以在一台大学管理的超级计算机上获得处理时间,这台超级计算机大约有10000个计算核。如果我提交整个作业进行处理,我会被放回任务队列,桌面计算机可以在超级计算机开始处理之前完成作业。支持人员告诉我,将2000个文件数据集划分为约100个文件作业将显著减少任务队列时间。在一次提交100个文件(共2000个)的同时,我可以使用

我有一个数据集,其中包括大约2000个数字图像。我正在使用MATLAB进行一些数字图像处理,从图像中提取树木。脚本当前配置为在n个核心上的
parfor
循环中处理图像

挑战:
我可以在一台大学管理的超级计算机上获得处理时间,这台超级计算机大约有10000个计算核。如果我提交整个作业进行处理,我会被放回任务队列,桌面计算机可以在超级计算机开始处理之前完成作业。支持人员告诉我,将2000个文件数据集划分为约100个文件作业将显著减少任务队列时间。在一次提交100个文件(共2000个)的同时,我可以使用什么方法使用
parfor
循环并行执行任务

我的脚本的结构如下所示:

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

与我的评论类似,我会不由自主地提出如下建议

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

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


我的经验法则背后没有数学理论,但在过去8年中,我一直是美国能源部大型超级计算机用户(个人时间超过1亿小时,分配所有者为5亿小时以上),直到最近我还在美国能源部的一个站点工作(尽管该站点的队列策略违反了我的规则).

我很可能误解了你的问题。以防万一:对于i=1:20,对于j=1:100,…,结束,结束,怎么样?数据处理应该是琐碎的…@matheburg我编辑了这篇文章,以澄清我当前脚本的结构。你说得对,我正在寻找重组
parfor
循环的建议。嗨,杰夫,我没有使用超级计算机的经验,但当我被你的答案绊倒时,我不得不问:1。所以你分配的作业比处理器少?这怎么可能有用呢?2.我不确定它与这个问题或我的答案有什么关系。您是否建议设置
jobSize=N/sqrt(numberOfProcessors)
?可能我弄错了:)我想说的是,如果你使用的是一台有900个节点的超级计算机,使用30个节点的作业可能会相对较快地通过队列,因为它们足够小,不需要排空(当机器为了释放一个大的块而闲置节点时)但是比小作业要大,这些作业是由用户提交的,并且代码不可伸缩。感谢您的快速响应。因此,在我们的例子中,这可能意味着将我们注册的工作人员数量限制在
30
(以保持您的示例为准)?如果您要提高吞吐量,最好提交30个节点的30个作业,而不是900个节点的1个作业或1个节点的900个作业。当然,并非所有的工作负载都可以任意分解,但有些工作负载是可以任意分解的。