【问题标题】:GNU Parallel - Alternate argumentGNU Parallel - 备用参数
【发布时间】:2020-09-14 14:55:40
【问题描述】:

我希望能够为我的并行命令的每次执行替换一个参数。

我有一个处理图像的脚本,我使用 GNU Parallel 同时启动多个进程。 我在这个脚本中使用了 GPU 核心,但我的 2 个 GPU 核心中只使用了一个。

我希望能够使用 2 个不同的配置文件(一个用于 GPU 1,一个用于 GPU 2)但我不知道该怎么做。

gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year $config" $config 每隔一次执行就会从 gpu_1 更改为 gpu_2

这可能吗?

谢谢????

编辑:

使用并行命令的作业号({#})作为参数,然后使用此作业号的模得到 0 或 1:

gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year {#}"

任务函数中:

task(){
...
jobnumber=$4    
gpu=$(expr $jobnumber% 2)
...
}

【问题讨论】:

  • 作业编号{%}或作业编号{#}怎么样
  • 是的!使用工作编号{#},然后对工作编号使用模 2 得到 0 或 1。谢谢!
  • 太好了,作业槽号似乎更好。如果由于任何原因奇数作业号需要更多时间,则 gpu1 上可以同时运行 10 个作业,而插槽号不能超过 5 个。

标签: bash gnu-parallel


【解决方案1】:

根据您的描述,您可能不希望 GNU Parallel 替代。想象一下,所有奇数工作需要 1 秒,所有偶数工作需要 2 秒。然后你最终会在同一个 GPU 上运行作业,而另一个 GPU 上没有运行。

您想要的是在 GPU2 上完成工作后立即在 GPU2 上开始工作。 {%}(又名职位空缺)就是为此而生的:

parallel -j2 'sleep {}; echo {}-GPU{%} seq {#}' ::: 1 2 1 2 1 2 1 2 1 2 1 2

【讨论】:

  • 这是我们与我的团队一起考虑过的事情,但我们很着急。我要在下一批试试这个。谢谢
【解决方案2】:

这样的事情应该可以工作:

seq 14 | parallel -k echo task {} {= '$_=seq() % 2 ? "gpu1" : "gpu2"' =}

输出

task 1 gpu1
task 2 gpu2
task 3 gpu1
task 4 gpu2
task 5 gpu1
task 6 gpu2
task 7 gpu1
task 8 gpu2
task 9 gpu1
task 10 gpu2
task 11 gpu1
task 12 gpu2
task 13 gpu1
task 14 gpu2

【讨论】:

    猜你喜欢
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多