여러 입력을 처리하기 위해 GNU Parallel에서 여러 개의 동등한 명령(여러 스레드 풀)을 사용

여러 입력을 처리하기 위해 GNU Parallel에서 여러 개의 동등한 명령(여러 스레드 풀)을 사용

처리하려는(파일을 다른 형식으로 변환) 큰 데이터 세트(>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 +$gpusCPU 스레드당 하나의 작업 실행 + $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)

관련 정보