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