예를 들어 다음을 실행할 수 있습니다.
parallel -j 200 < list0
"목록"에는 다음이 포함됩니다.
nice -n -20 parallel -j 100 < list2
nice -n -20 parallel -j 100 < list1
이것이 가능합니까/가능합니까?
답변1
이것은 가능할 뿐만 아니라 가능합니다. 어떤 경우에는 이것이 권장되기도 합니다.
GNU Parallel은 작업을 실행하는 데 약 10밀리초가 걸립니다. 따라서 8개의 코어가 있고 70밀리초 미만이 걸리는 작업을 실행하는 경우 단일 코어를 100% 사용하는 GNU Parallel을 볼 수 있지만 다른 코어에는 유휴 시간이 있습니다. 따라서 모든 코어를 100% 사용하지는 않습니다.
-j0
권장되는 또 다른 상황은 실제로 실행할 수 있는 것보다 더 많은 작업을 실행하려는 경우입니다 . 현재 -j0
특정 시스템 제한을 조정하지 않는 한 약 250개의 작업이 병렬로 실행됩니다. 작업이 CPU 및 디스크 I/O에 의해 제한되지 않는 경우 250개 이상의 작업을 실행하는 것이 합리적입니다. 예를 들어 네트워크 대기 시간이 제한 요소인 경우가 이에 해당합니다.
그러나 2개의 목록을 사용하는 것은 작업을 분할하는 권장 방법이 아닙니다. 권장되는 방법은 GNU Parallel을 사용하여 GNU Parallel을 호출하는 것입니다.
cat list0 | parallel -j20 --pipe parallel -j100
그러면 2000개의 작업이 병렬로 실행됩니다. 더 많은 조정이 필요합니다 -j
. 각 코어에 하나 이상의 GNU 병렬 프로세스가 있도록 코어 수는 외부(20) 이상인 것이 좋습니다.
이 기술을 사용하면 20,000개의 작업을 병렬로 시작하는 데 아무런 문제가 없습니다. 32,000개의 프로세스를 초과하면 문제가 발생하기 시작합니다.
처음 실행하면:
echo 4194304 | sudo tee /proc/sys/kernel/pid_max
나는 실행할 수 있습니다 :
seq 1000000 2000000000 |
parallel -j16 --roundrobin --pipe parallel -j0 --pipe parallel -j0 sleep
1백만 개의 프로세스를 병렬로 실행합니다(제 시스템에는 300G RAM이 필요합니다).
답변2
왜 이것이 불가능한지 모르겠습니다. 시스템은 확실히 동시에 200개의 병렬 작업을 처리할 수 있습니다.
그러나 정확한 수의 작업을 병렬로 실행해야 하는 특별한 이유가 없는 한 이는 거의 권장되지 않습니다. 내가 볼 수 있는 유일한 이유는 동시에 존재해야 하거나, 정보를 교환해야 하거나, 혼란스럽고 정의되지 않은 방식(예: 서버 프로그램 테스트)으로 다른 것과 필요하기 때문입니다.
이것이 바람직하지 않은 이유는 효율성 측면에서 시스템이 사용 가능한 프로세서 코어 수와 동일한 수의 프로세스를 실행하는 것이 이상적인 상황이기 때문입니다. 프로세스는 CPU 외부(예: 디스크 I/O)에서 어느 정도 병목 현상이 발생하는 경우가 많기 때문에 이 넓은 이상적인 숫자의 범위는 코어 수 + 1에서 코어 수 * 2까지입니다.
이것이 이상적인 효율성인 이유는 작업 자체가 100만 단위의 프로세서 시간을 소비한다면 동일한 작업을 순차적으로 10번 실행하면 1000만 단위가 소비되고 동일한 작업을 병렬로 실행하면 1000만 단위가 소비되기 때문입니다. 다만, 후자의 경우 CPU 개수가 10개 미만인 경우에는추가요금이 있습니다시스템은 한 작업에서 다른 작업으로 지속적으로 전환해야 하기 때문입니다.
이는 이유일반적으로 말하면2 x 2 Ghz 코어가 있는 시스템은 4 x 1 Ghz 코어가 있는 시스템보다 빠릅니다. 멀티 코어 시스템 개발의 주된 이유는 더 빠르고 더 빠른 CPU를 만드는 것이 불가능해지는 상대적으로 낮은 특정 지점을 넘어서 점점 더 어려워지기 때문입니다. 따라서 해결책은 더 많은 프로세서 코어를 갖춘 시스템을 만드는 것입니다.
간단히 말해서, 가능한 한 빨리 20가지 작업을 수행해야 하고 코어가 4개라면 가장 빠른 방법은 4회 5세트 또는 5회 4세트로 여유 시간을 확보하는 것입니다. 입출력. parallel
가변 길이 목록을 제공할 수 있지만 한 번에 실행할 작업 수를 제한합니다(이 숫자의 기본값은 코어 수입니다).
여기에는 예외가 있지만 일반적으로 특정 유형의 단일 멀티스레드 프로그램(예: 별도의 프로그램 묶음이 아니라 여러 코어를 차지하는 하나의 프로그램)과 관련되어 있습니다. 이는 프로그램이 가끔씩만 조정하면 되는 상대적으로 독립적인 분기를 통해 작업을 수행할 수 있는 경우가 더 쉽고 더 효율적이기 때문입니다("가끔"은 여전히 초당 10~20회일 수 있음). 임의의(비동기) 방식으로 작업을 반복하도록 설계하는 대신 별도의 스레드에서 이 작업을 수행하세요. 비디오 게임 및 CAD 시스템과 같은 그래픽 집약적 및/또는 대화형 프로그램이 이 범주에 속합니다.