gpt4 book ai didi

logging - 并行 MATLAB 和日志记录

转载 作者:太空宇宙 更新时间:2023-11-03 20:19:41 25 4
gpt4 key购买 nike

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

编辑:

  1. 我使用 embarrassingly parallel
  2. 我只想为所有工作人员创建一个文件(我有一个可以从所有机器访问的网络驱动器)

我主要关心的是让几个工作人员打开一个文件进行追加。我是否有丢失消息或打开文件时出错的风险?

最佳答案

当多个进程输出到单个文件时,您可能会遇到一些潜在的问题,例如消息被覆盖或混合。我在用其他语言(如 C)编写的程序中遇到过这种情况,我假设在 MATLAB 中可能会出现同样的问题,但我承认我对此可能是错误的。假设我没有错...

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

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

  • “主”进程首先必须打开文件。此代码(使用 labindex 函数)应在 process_fcn 的开头运行:

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

  • process_fcn 的周期点(主要任务完成时或在计算循环内),您必须让每个进程检查需要输出的数据(即data 不为空)并将该数据发送到“master”进程。然后,“主”进程将收集并打印来自其他进程的这些消息,以及它自己的任何消息。这是如何完成此操作的示例(使用函数 labBarrierlabProbelabSendlabReceive):

    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是否确保每个“从属”进程对 labSend 的调用发生在“主”开始查找已发送消息之前。

  • 最后,“master”进程必须关闭文件。此代码应在 process_fcn 结束时运行:

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

关于logging - 并行 MATLAB 和日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1075387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com