두 개의 CPU에 프로세스를 배포하는 방법

두 개의 CPU에 프로세스를 배포하는 방법

16개의 CPU를 갖춘 Ubuntu 서버가 있습니다. ( nproc --all보여줘 16)

다음 이름 으로 bash 스크립트를 작성했습니다 test.sh.

#!/bin/bash


while :
do
    echo xxx
done

나는 그것을 실행했다: ./test.sh >/dev/null &.

그런 다음 명령을 사용하여 topCPU 사용량을 모니터링한 결과 다음 프로세스로 인해 하나의 CPU가 거의 100% 사용되었음을 발견했습니다 test.sh.

6411 me       20   0   11240   3052   2852 R  93.8  0.0   0:11.71 test.sh
%Cpu5 : 96.7 us,  3.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

프로세스가 test.sh5번째 CPU에 할당되어 거의 100% 활용되는 것을 볼 수 있습니다.

CPU를 더 많이 활용할 수 있도록 무거운 프로세스를 여러 CPU에 분산하는 것이 가능합니까? 운영 체제가 test.sh여러 CPU에 프로세스를 분산하지 않는 이유는 무엇입니까? 프로세스가 test.sh충분히 무겁지 않기 때문인가요? 아니면 이를 위해 운영 체제를 일부 구성해야 합니까?

답변1

단일 스레드는 여러 코어로 분할될 수 없습니다.

여러 스레드(코어당 하나)를 갖도록 프로그램을 작성해야 하거나 여러 프로그램이 필요합니다. 그렇지 않다면 코어를 사용하지 않을 것입니다.

더 많은 코어를 사용하도록 프로그램을 작성하는 것은 사소한 문제가 아니며 모든 문제를 병렬화할 수 있는 것도 아닙니다(다중 코어에서 실행되도록 작성). 문제에 본질적으로 순차 코드가 20% 포함되어 있는 경우 무제한의 프로세서에 대한 원래 실행 시간(500% 빠름)보다 20% 빠르지는 않습니다. 그런 다음 오버헤드(스레드 간 통신)가 있습니다.

핵심 애플리케이션이 없다면 이를 판매하고 더 저렴한 시스템을 구입하는 것이 좋습니다.

단일 스레드를 처리하려면 코어당 많은 병렬 처리가 필요하지만 이는 눈에 띄지 않습니다. 이제 우리는 코어를 추가하면서 개별 코어를 더 빠르게 만들려고 노력하고 있습니다. 이것은 처음에는 잘 작동했습니다.

Unix 시스템(예: Gnu/Linux, 예: Ubuntu)은 최대 2→4까지 추가 코어를 효과적으로 활용합니다. Microsoft의 Windows에는 바이러스 스캐너용 코어, 조각 모음용 코어, 기타 모든 기능용 코어가 있어 성능이 향상됩니다.

그 이후에는 멀티 코어용으로 설계된 애플리케이션이 있는 경우에만 차이가 있습니다.

답변2

다음은 다중 프로세서를 사용할 수 있는 Linux 명령의 예입니다.

  • make -j
  • gcc -pipe

이 옵션은 대규모 프로젝트를 컴파일할 때 make특히 유용하고 간단합니다 gcc.

  • -fopenmpgcc를 호출할 때 빌드 옵션에 이 옵션을 추가하세요.

  • for 루프 위에 다음 pragma를 추가해 보세요.

    #pragma omp parallel for
    for(i=0; i<8000000000; i++) {
        ptr[i] = i/10000;
    }
    

기본적으로 OpenMP는 컴퓨터의 코어만큼 많은 스레드를 생성하고 스레드 간에 작업 부하를 균등하게 나눕니다.

관련 정보