GNU Parallel多输入列表下Perl表达式重复输出问题咨询
解决GNU Parallel多列表下Perl表达式重复输出的问题
要让{= '$_=slot()-1' =}只生成一次GPU编号,核心是明确区分Perl表达式和输入列表的替换位置,避免让Parallel把表达式重复应用到每个输入列表上。具体有两种常用方式:
方式1:用位置标记指定输入元素,单独保留Perl表达式
当你用多个:::传入输入列表时,用{1}、{2}等标记指代不同列表的元素,把Perl表达式作为单独的项只写一次。
比如你原来的错误命令:
parallel --dry-run --jobs 3 echo {= '$_=slot()-1' =} ::: 1 2 3 4 ::: a b c
修改为:
parallel --dry-run --jobs 3 echo {= '$_=slot()-1' =} {1} {2} ::: 1 2 3 4 ::: a b c
这样每个echo命令只会输出一次GPU编号,后面跟着对应两个列表的元素,不会重复生成编号。
方式2:将Perl表达式用于设置环境变量(适合GPU场景)
如果你的目标是给每个作业分配一个GPU编号,更合理的方式是把编号写入环境变量,这样整个作业只会使用一次编号:
parallel --dry-run --jobs 3 'export CUDA_VISIBLE_DEVICES={= '$_=slot()-1' =}; echo "GPU: $CUDA_VISIBLE_DEVICES, 输入1: {1}, 输入2: {2}"' ::: 1 2 3 4 ::: a b c
为什么原来的命令会重复输出?
当你在命令中只写{= ... =}而不指定位置标记时,GNU Parallel会默认把这个表达式重复应用到每个输入列表的位置。比如你传了2个:::列表,它就会把表达式执行2次,所以输出里会有两个编号;传3个列表就会执行3次,输出三个编号。
内容的提问来源于stack exchange,提问作者justapony
相关产品推荐
相关产品推荐

