GNU Parallel - Alternatives Argument
Ich möchte in der Lage sein, für jede Ausführung meines parallelen Befehls ein Argument zu wechseln.
Ich habe ein Skript zum Verarbeiten von Bildern und verwende GNU Parallel, um mehrere Prozesse gleichzeitig zu starten. Ich verwende den GPU-Kern in diesem Skript, aber nur einer meiner 2 GPU-Kerne wird verwendet.
Ich möchte 2 verschiedene Konfigurationsdateien verwenden können (eine für GPU 1 und eine für GPU 2), aber ich weiß nicht, wie ich das machen soll.
gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year $config" Wenn $ config bei jeder zweiten Ausführung von gpu_1 zu gpu_2 wechselt
Ist das möglich oder nicht?
Danke 😉
BEARBEITEN:
Verwenden Sie die Jobnummer des parallelen Befehls ( {#}) als Argument und erhalten Sie dann 0 oder 1, indem Sie das Modulo dieser Jobnummer verwenden:
gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year {#}"
In der Aufgabenfunktion :
task(){
...
jobnumber=$4 gpu=$(expr $jobnumber% 2)
...
}
Antworten
In Anbetracht Ihrer Beschreibung möchten Sie wahrscheinlich nicht, dass sich GNU Parallel abwechselt. Stellen Sie sich vor, dass alle ungeraden Jobs 1 Sekunde und alle geraden Jobs 2 Sekunden dauern. Dann werden Jobs auf derselben GPU ausgeführt, während keine auf der anderen ausgeführt werden.
Stattdessen möchten Sie, dass ein Job auf GPU2 beginnt, sobald ein Job auf GPU2 beendet ist. {%}(aka. job slot) ist dafür gemacht:
parallel -j2 'sleep {}; echo {}-GPU{%} seq {#}' ::: 1 2 1 2 1 2 1 2 1 2 1 2
So etwas sollte funktionieren:
seq 14 | parallel -k echo task {} {= '$_=seq() % 2 ? "gpu1" : "gpu2"' =}
Ausgabe
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