You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:15:20