问题描述
我正在准备一些要在由 SLURM 管理的集群上运行的 C++ 代码。集群采用一个编译文件:a.out。然后它将通过 JOB_ARRAY 在 500 个不同的节点上执行它。在执行文件的每个副本时,它需要读取一个输入参数,例如 double parameter
。我的想法是准备一个 .txt 文件,该文件将在每一行保存一个 parameter
值。实现读取这些 parameter
值的最佳策略是什么?
-
a.out 将从第一行读取值并立即将其删除。如果这是正确的策略,如何确保 a.out 的两个副本不会同时做同样的事情?
-
a.out 将从第 n 行读取值。如何让 a.out 的副本知道它与哪个 n 一起工作?
-
还有比上面两个更好的实施策略吗?如果是这样,如何做到这一点? 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 可区分)将通过此服务从文件中获取下一行。