如何准备在集群上执行的代码,以便一次从 .txt 文件中获取一个参数?

问题描述

我正在准备一些要在由 SLURM 管理的集群上运行的 C++ 代码。集群采用一个编译文件:a.out。然后它将通过 JOB_ARRAY 在 500 个不同的节点上执行它。在执行文件的每个副本时,它需要读取一个输入参数,例如 double parameter。我的想法是准备一个 .txt 文件,该文件将在每一行保存一个 parameter 值。实现读取这些 parameter 值的最佳策略是什么?

  1. a.out 将从第一行读取值并立即将其删除。如果这是正确的策略,如何确保 a.out 的两个副本不会同时做同样的事情?

  2. a.out 将从第 n 行读取值。如何让 a.out 的副本知道它与哪个 n 一起工作?

  3. 还有比上面两个更好的实施策略吗?如果是这样,如何做到这一点? C++ fstream 是要走的路,还是我应该尝试一些完全不同的东西。

感谢您的任何想法。 如果您还为 a.out 的外观留下了一些非常简单的代码,我将不胜感激。

解决方法

选项二是最好的方法:您可以使用 $SLURM_ARRAY_TASK_ID 来获取特定行,因此您的作业脚本中的调用很简单:

import React from "react"; import PropTypes from "prop-types"; import { Box,InputLabel,FormHelperText } from "@material-ui/core"; import CurrencyTextField from "@unicef/material-ui-currency-textfield"; const CurrencyTxtField = ({ defaultValue,disabled,error,helperText,id,label,labelHidden,name,onChange,onBlur,persistHelperText,required,value,digitGroupSeparator,variant,currencySymbol,outputFormat,textAlign,}) => { return ( <Box pt={1.5}> {labelHidden ? <Box component="label" display="none">{label}</Box> : <InputLabel htmlFor={id} required={required} disabled={disabled}>{label}</InputLabel> } <CurrencyTextField label="" variant={variant} value={value} currencySymbol={currencySymbol} outputFormat={outputFormat} digitGroupSeparator={digitGroupSeparator} textAlign={textAlign} onChange={onChange} onBlur={onBlur} defaultValue={defaultValue} disabled={disabled} required={required} name={name} id={id} error={error} /> <FormHelperText error={error} disabled={disabled}>{(error || persistHelperText) && helperText}</FormHelperText> </Box> ); }; CurrencyTxtField.defaultProps = { disabled: false,error: false,labelHidden: false,type: "text",persistHelperText: false,currencySymbol: "$",outputFormat: "number",digitGroupSeparator: "",variant: "outlined",}; CurrencyTxtField.propTypes = { autoFocus: PropTypes.bool,inputComponent: PropTypes.func,defaultValue: PropTypes.node,disabled: PropTypes.bool,error: PropTypes.bool,helperText: PropTypes.string,id: PropTypes.string.isRequired,label: PropTypes.string.isRequired,labelHidden: PropTypes.bool,name: PropTypes.string,onBlur: PropTypes.func,onChange: PropTypes.func,persistHelperText: PropTypes.bool,required: PropTypes.bool,type: PropTypes.string,value: PropTypes.node,}; export default CurrencyTxtField;

这应该得到与任务数组 ID 对应的行。

,

您可以部署一个参数文件,每个可执行文件都包含一行,这是最简单的解决方案,因为您事先知道要部署多少个节点。

或者你可以让一个节点扮演服务注册的角色。然后服务寄存器会将参数分发到节点(例如通过网络)。它可以保存一个参数列表,每个客户端(例如通过 IP 可区分)将通过此服务从文件中获取下一行。