Parallelism
在 GNU 並行中使用多個等效命令(多個執行緒池)處理多個輸入
我有一個要處理的大型數據集(> 200k 個文件)(將文件轉換為另一種格式)。該算法主要是單執行緒的,因此使用並行處理是很自然的。但是,我想做一件不尋常的事情。每個文件都可以使用兩種方法之一(基於 CPU 和 GPU)進行轉換,我想同時使用 CPU 和 GPU。
抽像地說,我有兩個不同的命令(
foo
和bar
),它們應該產生相同的結果。我想組織兩個具有固定容量的執行緒池,它們將分別執行最多 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)