![여러 입력을 처리하기 위해 GNU Parallel에서 여러 개의 동등한 명령(여러 스레드 풀)을 사용](https://linux55.com/image/180021/%EC%97%AC%EB%9F%AC%20%EC%9E%85%EB%A0%A5%EC%9D%84%20%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0%20%EC%9C%84%ED%95%B4%20GNU%20Parallel%EC%97%90%EC%84%9C%20%EC%97%AC%EB%9F%AC%20%EA%B0%9C%EC%9D%98%20%EB%8F%99%EB%93%B1%ED%95%9C%20%EB%AA%85%EB%A0%B9(%EC%97%AC%EB%9F%AC%20%EC%8A%A4%EB%A0%88%EB%93%9C%20%ED%92%80)%EC%9D%84%20%EC%82%AC%EC%9A%A9.png)
처리하려는(파일을 다른 형식으로 변환) 큰 데이터 세트(>200,000개 파일)가 있습니다. 알고리즘은 대부분 단일 스레드이므로 병렬 처리를 사용하는 것이 당연합니다. 그러나 나는 뭔가 특이한 일을 하고 싶었다. 각 파일은 두 가지 방법(CPU 및 GPU 기반) 중 하나를 사용하여 변환할 수 있는데, CPU와 GPU를 모두 사용하고 싶습니다.
추상적인 의미에서 동일한 결과를 생성하는 두 개의 서로 다른 명령( foo
및 ) 이 있습니다 . bar
고정된 용량을 가진 두 개의 스레드 풀을 구성하고 각각 최대 N foo
및 M 인스턴스를 실행 bar
하고 풀 중 하나를 사용하여 사용 가능한 슬롯이 있는 풀에 따라(성별을 결정할 필요가 없거나 필요 없음) 각 입력 파일을 처리하려고 합니다.
GNU Parallel이나 다른 도구에서 비슷한 작업을 수행할 수 있습니까?
답변1
이 같은:
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).
답변2
#!/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)