PDA

查看完整版本 : 并行MATLAB和日志记录


poster
2019-12-10, 16:49
我正在运行使用并行计算工具箱分布在多台计算机上的实验。我希望能够生成实验进度(或发生的任何错误)的日志,并在进程运行时将此信息保存在文件中。这样做的标准方法是什么?

编辑:


我尴尬地使用并行
我只需要一个文件供所有工作人员使用(我有一个可以从所有计算机访问的网络驱动器)
我主要关心的是打开一个文件供几个工作人员附加。我是否有丢失消息或打开文件出错的风险?


回答:
当多个进程输出到一个文件时,您可能会遇到一些潜在的问题,例如消息被覆盖或混合。我曾经在其他语言(例如C)的程序中发生过这种情况,并且我假设在MATLAB中可能会出现相同的问题,但是我自由地承认我对此可能是错的。假设我没有错...

如果要在进程运行时将多个工作进程的数据可靠地输出到单个日志文件,执行此操作的一种方法是让一个进程负责所有文件操作(即“主”进程)。 “主”进程将从其他工作程序(即“从站”)收集消息,并将此数据输出到日志文件。

由于我不知道您要具体执行每个流程,因此很难建议您进行特定的代码更改。以下是一些步骤和示例代码,介绍了如何在MATLAB中执行此操作。这些代码示例假定您在每个进程上运行相同的函数( process_fcn ):


首先,“主”进程必须打开文件。此代码(使用labindex (http://www.mathworks.com/help/toolbox/distcomp/labindex.html)函数)应在process_fcn的开头运行:

if (labindex == 1), fid = fopen('log.txt','at'); %# Open text file for appending end
在每个进程运行时,您可以在名为data的变量中收集需要输出到日志文件的任何数据,该变量存储字符串或字符数组。此数据可能是在try-catch块中 (http://www.mathworks.com/help/techdoc/matlab_prog/bq9l46c-1.html)捕获的错误消息,也可能是您希望存储在日志文件中的任何其他数据。

在process_fcn的周期点(主要任务完成时或在计算循环内),您将必须让每个进程检查需要输出的数据 (即数据不为空),并将该数据发送到“大师”过程。然后,“主”进程将与其他进程一起收集并打印这些消息。以下是如何完成此操作的示例(使用功能labBarrier (http://www.mathworks.com/help/toolbox/distcomp/labbarrier.html) , labProbe (http://www.mathworks.com/help/toolbox/distcomp/labprobe.html) , labSend (http://www.mathworks.com/help/toolbox/distcomp/labsend.html)和labReceive (http://www.mathworks.com/help/toolbox/distcomp/labreceive.html) ):

labBarrier; %# All processes are synchronized here if (labindex == 1), %# This is done by the "master" if ~isempty(data), fprintf(fid,'%s\n',data); %# Print "master" data end pause(1); %# Wait a moment for "slaves" to send messages while labProbe, %# Loop while messages are available data = labReceive; %# Get data from "slaves" fprintf(fid,'%s\n',data); end else %# This is done by the "slaves" if ~isempty(data), labSend(data,1); %# Send data to the "master" end end data = ''; %# Clear data 调用PAUSE (http://www.mathworks.com/help/techdoc/ref/pause.html)可以确保对每个“从属”进程的labSend调用都在“主”开始查找已发送消息之前进行。

最后,“主”进程必须关闭文件。此代码应在process_fcn的末尾运行:

if (labindex == 1), fclose(fid); end


更多&回答... (https://stackoverflow.com/questions/1075387)