Elabora più input con più comandi equivalenti (più pool di thread) in GNU parallel
Ho un set di dati di grandi dimensioni (> 200k file) che vorrei elaborare (convertire i file in un altro formato). L'algoritmo è principalmente a thread singolo, quindi sarebbe naturale utilizzare l'elaborazione parallela. Tuttavia, voglio fare una cosa insolita. Ogni file può essere convertito utilizzando uno dei due metodi (basato su CPU e GPU) e vorrei utilizzare contemporaneamente CPU e GPU.
Parlando in modo astratto, ho due diversi comandi ( fooe bar), che dovrebbero produrre risultati equivalenti. Vorrei organizzare due pool di thread con capacità fissa che funzionerebbero rispettivamente fino a N istanze di fooe M istanze di bared elaborare ciascun file di input con uno di questi pool a seconda di quale ha slot liberi (il determinismo non è richiesto o desiderato) .
È possibile fare qualcosa del genere in GNU parallelamente o con qualsiasi altro strumento?
Risposte
Qualcosa come questo:
gpus=2
find files |
parallel -j +$gpus '{= $_ = slot() > '$gpus' ? "foo" : "bar" =}' {}
Meno spaventoso:
parallel -j +$gpus '{=
if(slot() > '$gpus') { $_ = "foo"
} else {
$_ = "bar"
}
=}' {}
-j +$gpus Esegui un lavoro per thread della CPU + $ gpus
{= ... =} Usa il codice Perl per impostare $ _.
slot() Numero slot di lavoro (1..cpu_threads + $ gpus).
#!/usr/bin/env bash
values=( a b c d e f g h i j k l m n o p q r s t u v w x y z)
start=0
function foo()
{
sleep 4
echo "foo ${1}" } function bar() { sleep 4 echo "bar ${1}"
}
function baz()
{
sleep 4
echo "baz ${1}" } while [ ${#values[@]} -gt 0 ]
do
if [ ${#values[@]} -gt 0 ] then foo "${values[0]}" &
values=("${values[@]:1}") fi if [ ${#values[@]} -gt 0 ]
then
bar "${values[0]}" & values=("${values[@]:1}")
fi
if [ ${#values[@]} -gt 0 ] then baz "${values[0]}" &
values=("${values[@]:1}")
fi
wait
done
valori values=( a b c d e f g h i j k l m n o p q r s t u v w x y z)che puoi sostituire convalues=$(ls -1)