Elabora più input con più comandi equivalenti (più pool di thread) in GNU parallel

Sep 12 2020

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

1 OleTange Sep 13 2020 at 04:43

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).

MarekLisiecki Sep 12 2020 at 08:18
#!/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)