这个包提供了在一台机器上的多个核心上的并行处理,或者在可以访问公共目录的多台机器上的并行处理。
如果你有多个相互独立的函数调用,你可以将你的代码写成
for k = 1:numel(parameterCell)
resultCell {k} = myfun (parameterCell {k});
结束
然后,用
resultCell = startmulticoremaster(@myfun, parameterCell);
允许你并行计算你的循环。所有您需要做的是启动尽可能多的附加Matlab会话/进程,因为您希望奴隶工作,并运行
startmulticoreslave
在那些额外的Matlab会话中。
所有的程序都是在简单的和平台无关的Matlab中编写的——不使用工具箱,不需要编译mex文件。
请从1开始。文档文件multicore.html, 2。函数startmulticoremaster的帮助行。米和3。演示函数multicoredemo.m。
与其他用户在此讨论:http://groups.yahoo.com/group/multicore_for_matlab
我花了很多时间来开发这个包。如果你想让我知道你很欣赏我的工作,你可以通过捐款来表达你的感激:https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=GPUZTN4K63NRY
关键词:并行处理,分布式计算,多核。
马库斯Buehren(2021)。多核-多核并行处理(//www.tianjin-qmedu.com/matlabcentral/fileexchange/13775-multicore-parallel-processing-on-multiple-cores), MATLAB中央文件交换。检索.
好的,知道了…请忽略我之前的评论。
嗨,我没有任何使用树莓派的经验,但我看不出有什么理由它不能工作。你需要至少有两个Matlab会话并行运行,他们需要一个公共目录,在那里他们可以读/写文件。剩下的是简单的Matlab。
你好,
我正在使用MATLAB硬件支持包在树莓派上执行我的模型。万博1manbetx
我将使用IP从MATLAB连接到树莓派。
有没有可能我可以运行miticore在树莓-pi从MATLAB ?
提前谢谢。
Nagendar
谢谢,很好用。另外一个问题——有什么建议告诉工人他们的过程已经完成,他们不需要等待更多的评估要求吗?
对于我之前的评论,我很抱歉。
我是想把它贴在《差异进化》投稿栏里的。
喂,
我们能不能把脚本的最优内容写在“sim-Befehls”里面?
我很高兴见到你
如何在集群(基于Linux)上使用这个包?我可以访问一个集群,但必须使用job = batch(......)从我的本地笔记本或桌面的Matlab中提交作业到集群。
如何在集群上打开尽可能多的matlab会话,使用job = batch(......)?
希望能听到一些反馈!
谢谢!
把我上一篇文章的第一个建议去掉。我刚刚读了David下面的文章,并没有意识到-nodisplay标志。
优秀的功能。在多目标优化的情况下,这对我很有帮助
嗨西奥,
不同的Matlab进程通过多核包中的文件系统进行通信。所有函数的输入和输出参数都保存到文件系统中或从文件系统中读取。在您的示例中,多核主进程将在磁盘上节省大约8 MB(100万倍)的文件,这些文件将被从进程读取。在这种情况下,开销明显大于并行处理的好处。
如需进一步讨论,请访问雅虎群组:http://groups.yahoo.com/group/multicore_for_matlab
你的
马库斯
当我尝试运行以下代码段:
清除所有;
2 = 1:10 0
heavy_cell{2} =兰德(1000、1000);
结束
myfun = @inv;
resultCell =细胞(大小(heavy_cell));
抽搐
k = 1:元素个数(heavy_cell)
resultCell {k} = myfun (heavy_cell {k});
结束
toc
清楚resultCell;
抽搐
resultCell = startmulticoremaster(@inv, heavy_cell);
toc
我的结论是:
运行时间为26.412324秒。
运行时间为111.729816秒。
后者是并行处理的结果。我想我肯定遗漏了什么。有人能详细说明一下吗?
非常漂亮的包。
很适合我。
此外,作者回答你的问题又快又好。
做得好,谢谢
我添加了这段代码到startmulticoremaster,这样它就会自动启动适当数量的奴隶(确保你的路径设置正确,这样它就可以找到startmulticoreresave。启动时):
%奴隶开始:
max_instances = 4;
[status,result] = system('tasklist /FI "imagename eq matlab.exe" /fo table /nh');
currently_running =长度(strfind(因此,MATLAB.exe));
For I = 1:(max_instances-currently_running)
"C: Program Files MATLAB\R2013b\bin\ MATLAB .exe" -nodisplay -nosplash -nodesktop -r "run(' startmulticoressave .m');exit;"
结束
包是相当有用的。如果它不使用基于文件的变量传输,而是直接使用内存,那么它会更有用。目前启动并行进程需要一段时间,因为有很大的开销
我测试了这段代码,并与parfor进行了比较
运行STARTMULTICOREMASTER的耗时:4.80秒。
运行STARTMULTICOREMASTER的耗时:4.72秒。
运行STARTMULTICOREMASTER的耗时:4.70秒。
运行STARTMULTICOREMASTER的耗时:4.69秒。
运行STARTMULTICOREMASTER的耗时:4.70秒。
没有从服务器支持的运行时间:20.84秒。万博1manbetx
而且只有帕尔帕
只使用parfor运行TESTFUN的耗时:3.21秒。
parfor似乎更强大,使用起来也更简单。
非常有用的工具运行并行会话。通过对代码进行一些微调,主要增加了一些“设置”和“清理”功能来处理打开和关闭最低限度的从会话,我已经在同一台机器的多个核心上运行了这个程序,也在多台机器上运行。
目前运行这个相当愉快的约23/24会议。
很好,和描述的一模一样!考虑到我们花了多少钱在这个软件上,这个功能并没有包含在Matlab中,这有点可笑。
嗨,有没有人成功地在更大范围内使用这个包。在我的例子中,当运行在100个核上时,它实际上并不能很好地工作。由于某些原因,slave在一个循环中卡住了消息“忽略旧的文件信号量”??
伟大的工作! !
有没有一种方法使用这个包而不必手动启动Matlab?
我提出这个问题的原因如下。我使用Torque提交到一个16个节点的集群,每个节点有64个核。然而,我不能在一个节点中启动多个matlab实例(即使它有64个核)。非常感谢您的帮助!!多谢。
我只激活了3个奴隶。演示在我的8核笔记本电脑上工作得很好!确保每个会话都设置了查看多核文件夹的路径。
> > multicoredemo
运行STARTMULTICOREMASTER的耗时:7.04秒。
运行STARTMULTICOREMASTER的耗时:7.39秒。
运行STARTMULTICOREMASTER的耗时:7.35秒。
运行STARTMULTICOREMASTER的耗时:6.74秒。
运行STARTMULTICOREMASTER的耗时:6.77秒。
没有从服务器支持的运行时间:20.86秒。万博1manbetx
直接运行TESTFUN的耗时:19.84秒。
效果很好,谢谢
我尝试运行我的功能与3个不同的数据集在一起,但奴隶进程没有做任何事情,时间是一样的,如果我运行没有它。
我可以使用它来运行多个进程访问相同的功能使用不同的参数单元。请注意,该函数在每次调用中接受图像输入。会有问题吗?
谢谢,非常好的代码
很棒的包!对于多核cpu来说绝对有用。我有一个6核AMD。如果MATLAB不能并行运行,这是一件多么痛苦的事情。
我有一个给新手的演示技巧:
如果希望看到效果,请确保函数必须在输入单元格上至少运行几次。如果你的函数只有一个输入,所有的从会话将什么都不做,因为函数已经在主上运行。你可能想要把你的输入分段,使所有的奴隶同时运行。
这个工具真的很强大。我想知道我们是否可以用Fortran或C语言开发一个类似的工具。有两个原因:
1)由于每个主程序和从程序都需要一个matlab窗口,所以购买多个matlab许可证在不同的机器上运行太贵;
2)从程序是用matlab启动的,也需要100mb以上的内存,但从程序可能只需要启动另一个不同参数的外部执行程序。编写一个纯主/纯程序将大大减少内存的使用。
谢谢,
Zhanhgong唐
只是太棒了!
我有一个优化问题-包括几个启动的Simulink模型-运行在一个单一的核心超过30个小时。万博1manbetx通过按照Marcus脚本的要求重新制定问题(半天的工作),我目前使用了5台Windows pc,总共14个核,在3.1小时内完成了模拟。
谢谢你! !
你好马库斯,
伟大的工作!
我可能有一个建议:文件I/O在我的应用程序中成为瓶颈,因为保存任务的元数据(大图像序列)花费的时间几乎和处理任务一样多。如果文件I/O可以被共享内存函数替换,并且有一个新的Matlab库可以使用,可能会有很大的帮助://www.tianjin-qmedu.com/matlabcentral/fileexchange/28572-sharedmatrix.我认为这是对你图书馆的完美补充。
最好的
兴华
别介意我之前的评论.....我没有读说明书:)
m档案5星,客户服务6星。谢谢马库斯!
运行多核演示程序没有改进。m文件
运行STARTMULTICOREMASTER的耗时:21.53秒。
运行STARTMULTICOREMASTER所需时间:21.67秒。
运行STARTMULTICOREMASTER的耗时:21.31秒。
运行STARTMULTICOREMASTER的耗时:21.31秒。
运行STARTMULTICOREMASTER的耗时:21.30秒。
没有slave支持的运行时间:21.14秒。万博1manbetx
直接运行TESTFUN的耗时:20.00秒。
太棒了。你是我的救世主。代码像魅力一样工作!
谢谢你的这些工具,它们非常有用,将节省我很多时间。
伟大的
我在这个代码中的lasterror函数有问题。在一些实例中,lasterror函数被传递一个字符串'reset'作为输入参数,但是lasterror函数仅为结构类型的输入定义。这导致代码中的几个点出现错误,我无法运行多核演示例程。我知道这是我做错了,但如果有人能帮我,我会很感激的!
你好马库斯,
首先,你开发了一个很棒的工具,在音频信号处理领域的模拟中帮助了我很多。看到我的双四核在100%(而不是13%)负载温暖了我的心:)。
好吧,我不确定我是否在这里做错了什么,但当multicoremaster()(和奴隶)执行的函数有多个返回值时,我遇到了一些问题。在这种情况下,除了第一个返回值外,所有返回值似乎都丢失了。我用了一个小技巧来解决这个问题:
每次调用feval()时(在startmulticoremaster()和startmulticoresreserve()中),我都添加了这样的内容:
N_returnValues = nargout (functionHandleCell {k});
明确的(“returnValue”);这太脏了!下一个电话不起作用
%不事先清除“returnValue”if
% N_returnValues = = 1。如果是更大的- >没有
%问题(即使没有清除
%”returnValue”)
[returnValue{1:N_returnValues}] = feval(functionHandleCell{k}, parameterCell{k}{:});%哈!
resultCell {k} = returnValue;
这样,从startmulticoremaster()返回的resultcell总是一个单元格——即使被调用的函数只有一个返回值……
我希望这对任何人都有价值,我张贴这个hack并没有造成麻烦:)。我总是乐于学习更好的解决方案....
干杯,再次感谢多核!
卡尔
非常感谢这个伟大的工具!我几个月前开始使用您的代码,我必须说它为我节省了很多时间。
很棒的工具,我用它来拟合一个计算昂贵的金融模型,它工作得很好。非常感谢您的发表!!约翰内斯
我在网络上运行主进程和从进程有一点问题。我不确定如何在linux网络上共享文件夹!
任何人都可以帮忙吗?
抱歉,刚刚错过了用startmulticoresreserve启动第二个matlab会话。
伟大的代码。
你好,当我运行多核演示程序时,只有主程序在工作,而不是从程序。我哪里做错了?
无法使用多线程/被设置为一个核心。
我使用windows vista和Matlab 7.8.0 R2009a 64位的双核处理器。
非常感谢。
伟大的工作!
在一台四驱电脑上,我的工作速度提高了两倍以上。为了使用它,不需要做太多的改变。
谢谢
近红外光谱
伟大的工具!
辉煌的工具!当满屋子的电脑开始做你的模拟工作时,你可以坐下来看着进度条滑动。
我有一个问题-什么维度通常用于parameterCell?我尝试过做一些大的多维运行(例如4x150x10),事情似乎慢慢停止了——我仍然在研究它,只是想知道我使用的维度是典型的还是太大了。
欢呼。伟大的工作,
理查德。
很棒的程序,特别适合我在遗传算法方面的工作。但我注意到一个小错误。在startmulticoresave中,如果你激活调试模式,你会看到下面一行(77):
fileNr = str2double (regexptokens (parameterFileName,……
“parameters_ \ d + _ (\ d +) \ .mat '));
但是没有regexptokens函数,至少在R2007a或R2007b或R2008a中没有。我的解决方案是用下面的行替换它(尽管我相信有人可以想出更健壮和/或优雅的东西)。
fileNrCell = regexp (parameterFileName, parameters_ \ d + _ (\ d +) \。席”、“标记”);
fileNr = str2double (fileNrCell {1});
节目很精彩,再次感谢!
我在雅虎上为多核包开了一个讨论组。请加入并与其他用户讨论!
http://groups.yahoo.com/group/multicore_for_matlab/
我已经使用多核有一段时间了,它绝对是优秀的。我用的是5台双xeon x5460和几个四芯盒。
我想知道是否有人比较这个工具箱的性能与parfor并行计算matlab工具箱。他们是同类吗?
我相信我现在的瓶颈是由于硬盘I/O,所以我正在寻找这在内存中的可能性,或潜在地升级我的hd到固态,以减少开销。
顺便说一下,我也尝试了预先创建所有的mat文件一次,而不是做多个循环来减少I/O。不幸的是,这并没有像我希望的那样起作用。
不要误解我的意思,这比单线程快得多,但我们总是需要继续推进:)。
谢谢你的贡献,非常有用。
更正:
我在一组运行不同操作系统的计算机中使用过:GNU/Linux、Mac和Windows (XP)。当共享文件夹在网络计算机上(没有映射到本地驱动器,例如:\\servername\sharedfolder);Windows系统试图删除信号量失败,导致主进程永远运行。
我找到的解决方案是稍微修改compsep。m和concatpath。m如下:
_______________________________________________________
STR = chompsep(STR)
unix_sep = ' / ';
pc_sep = ' \ ';
If isunix && str(1)==pc_sep . aspx
STR = strrep(STR, pc_sep, unix_sep);
Elseif ispc && str(1)==unix_sep . Elseif ispc && str(1)==unix_sep . Elseif
STR = strrep(STR, unix_sep, pc_sep);
结束
If ~isempty(str) && (str(end) == unix_sep || str(end) == pc_sep)
str(结束)= ";
结束
_______________________________________________________
函数STR = concatpath(varargin)
unix_sep = ' / ';
pc_sep = ' \ ';
str = ";
为n = 1:输入参数个数
curStr =变长度输入宗量{n};
str = fullfile(str, chompsepp (curStr)); / /返回当前位置
结束
If isunix && str(1)==pc_sep . aspx
STR = strrep(STR, pc_sep, unix_sep);
Elseif ispc && str(1)==unix_sep . Elseif ispc && str(1)==unix_sep . Elseif
STR = strrep(STR, unix_sep, pc_sep);
结束
谢谢你!这工作很好,现在我有100%的CPU使用所有4核!通过测量运行时间,它的运行速度似乎比用一个matlab完成所有工作快3.4倍,所以在我的四核上大约有85%的效率
现在,如果它能运行在一台多核机器上,只运行一个matlab实例就好了
我和罗哈里有同样的问题。当主服务器结束计算时,有一个从服务器仍在工作,主服务器再次计算剩余的工作,产生一个额外的迭代。
解决方案是设置maxmaster胯下的所有缺陷,因为我理解这不是一个bug,而不是一个不知道奴隶是否被中断的问题。
顺便说一下,这招很管用。
我在两台双核机器上测试了这些功能。当并行处理双核机器的处理器之间或两台机器之间使用一个处理器时,我获得了很大的收获。然而,当我尝试在两台机器上同时使用这两种处理器时,我并没有得到显著的收获。这是因为当您增加更多的处理器/机器时,数据记录负载的增加会减少使用更多处理器的收益吗?此外,有时我得到一个错误,其中一个工人不能删除临时文件,这似乎更频繁地发生时,你增加工人的数量。有人有同样的问题吗?我的两台机器运行的是Vista 64位系统。
这似乎是有可能的主从同时评估同一组参数。例如,如果slave开始计算一个慢进程,master可以赶上,没有什么可以阻止它开始相同的计算,因为slave还没有生成结果文件。在setfilesemaphore.m中也有一个错误。dirStruct (k)。第78行中的datenum应该是datenum(dirStruct(k).date)。
太棒了! ! !
其绝对优秀。我现在在我的四核机器上使用它,我可能会买另一个四核,只是为了看到我的模型运行得这么快。:)
才华横溢的图书馆。非常有效
这个过程非常有效。对于我的模型估计,我能够以一种极端的方式削减执行时间。Markus也很友善,对我的问题反应非常积极。
>用于避免使用
>主核心是可取的
这个选项已经存在了:您可以使用输入参数maxmasterevaluated并将其设置为0。
一个避免使用主核心的选项是可取的
事实上,如果一个从进程终止或崩溃,整个进程将继续,但如果崩溃的迭代碰巧是在主核心上,那么所有进程都将受损
很好,只是有一些困难,以杀死奴隶:进程持续和CNTR C不工作。应该等待执行结束
谢谢,很有用的。同步不是最优的(例如,如果从程序已经在运行,主程序就不应该开始运行),但它仍然是一个很好的程序。
非常有用,工作非常出色。
比Matlab提供的分布式计算工具箱(使用起来非常困难)要多得多。
我的SO是Linux,我正在用4个工人(2个双核处理器)工作。
极好地工作。这将是很好的看到这变成一个完全引导的设置使用这个。
多核总体上工作得很好。不过我有个问题。我在parameterCell中犯了一个错误。从进程都因此而死亡。当我试图退出所有从进程并重新启动时,导致从进程死亡的相同错误再次出现。
很棒的计划……从一台机器上的4个处理器到5台机器上的10个处理器,我都成功地运行了它。它使一整套计算昂贵的项目在MATLAB中可行。
在6台机器上用8个处理器运行,效果很好。不幸的是,如果您杀死一个或多个处理器,主处理器必须完成这项工作。由于这些工作对于我的问题来说太长了,所以最好在这种情况下终止所有工作,并在命令行完成所有工作。主服务器从列表的顶端开始,而从服务器从底部开始。当他们在中间的某个地方相遇时,主人总是会重做其中一项工作。我不认为代码对于大量非常小的工作是有效的(如果我错了请纠正我);因此,我建议将作业设置为中等长度,例如(总运行时间)/(10*(处理器数量))。对于我的问题,这些都是相当次要的问题。作者在这段代码上做得很好——轻松地节省了我的工作时间——谢谢!
是和否:如果目录不存在,从进程应该创建它(我已经更新了)。但是,您可以随时启动从进程!您还可以在主服务器运行时中断并重新启动它们。
明智地使用文件系统来共享负载。虽然不是2倍的增长,但在快速集群测试中,我用5CPU的80%效率提高了4倍。
在基于Intel Xeon的双处理器机器上,它将计算时间减半,即减少了2倍!
哇! !经过几个小时艰苦的多核实验,我终于学会了如何使用这段代码在我的四核PC上并行运行。这是一个非常好的和有用的分布式计算工具!!
1.演示中的信息文本必须扩展到详细描述如何在并行系统中运行“tesfun”。
2.必须做一些工作来最小化进程间通信开销,在某些情况下,进程间通信开销可能非常大(占总负载的25%)。
好工作! !
我无法复制测试演示代码从顺序到并行(多核)实现的任何改进。
我可以说,在某些情况下,并行(多核)实现比顺序实现要慢。
有可能使它与Octave兼容吗?由于许可限制,许多人很难获得大量Matlab实例。
修正:
我用下面的代码测试了这个程序,看看这个程序是否可以改善在一台机器上的并行处理:
______________________
N = 20;
m = 1:10
抽搐
对于z = 1:N
testfun (z)
结束
toc
结束
__________________________
结果显示,与我的代码相比,该程序在一台机器上没有任何改进!
所以我再次评估
在一台机器上的多核并行处理是非常有用的!
长期由于标准matlab能力
它是否也适用于脚本,还是仅适用于函数?
演示应该更加自我描述。与单核演示运行的比较对于并行化影响评估具有重要意义。