Parallelism

在 GNU 並行中使用多個等效命令(多個執行緒池)處理多個輸入

  • September 13, 2020

我有一個要處理的大型數據集(> 200k 個文件)(將文件轉換為另一種格式)。該算法主要是單執行緒的,因此使用並行處理是很自然的。但是,我想做一件不尋常的事情。每個文件都可以使用兩種方法之一(基於 CPU 和 GPU)進行轉換,我想同時使用 CPU 和 GPU。

抽像地說,我有兩個不同的命令(foobar),它們應該產生相同的結果。我想組織兩個具有固定容量的執行緒池,它們將分別執行最多 N 個實例foo和 M 個實例bar,並使用這些池中的任何一個處理每個輸入文件,具體取決於哪個池有空閒插槽(不需要或不需要確定性) .

是否有可能在 GNU 並行或任何其他工具中做類似的事情?

像這樣的東西:

gpus=2

find files |
 parallel -j +$gpus '{= $_ = slot() > '$gpus' ? "foo" : "bar" =}' {}

不那麼可怕:

 parallel -j +$gpus '{=
     if(slot() > '$gpus') {
       $_ = "foo"
     } else {
       $_ = "bar"
     }
   =}' {}

-j +$gpus每個 CPU 執行緒執行一項作業 + $gpus

{= ... =}使用 perl 程式碼設置 $_。

slot()作業槽號 (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

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)您可以替換為的值values=$(ls -1)

引用自:https://unix.stackexchange.com/questions/609024