두 개의 CPU에 하나의 프로세스를 할당하는 방법

두 개의 CPU에 하나의 프로세스를 할당하는 방법

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

test.sh나는 아래와 같은 이름의 bash 스크립트를 작성했습니다 .

#!/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에 무거운 프로세스를 할당하는 것이 가능합니까? OS가 test.sh둘 이상의 CPU에 프로세스를 할당하지 않은 이유는 무엇입니까 ? 프로세스가 충분히 무겁지 않기 때문인가요 test.sh? 아니면 그렇게 하려면 OS에 대한 일부 구성을 수행해야 합니까?

답변1

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

프로그램은 둘 이상의 스레드(코어당 하나)를 갖도록 작성되어야 하거나, 둘 이상의 프로그램이 있어야 합니다. 그렇지 않으면 코어를 사용하지 않을 것입니다.

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

코어에 대한 응용 프로그램이 없으면 코어를 판매하고 더 저렴한 기계를 구입하는 것이 좋습니다.

각 코어에는 단일 스레드를 처리하기 위해 엄청난 양의 병렬 처리가 있지만 이는 표시되지 않습니다. 이제 우리는 코어를 추가하면서 단일 코어를 더 빠르게 만들기 위해 고군분투하고 있습니다. 처음에는 잘 작동합니다.

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는 컴퓨터의 코어만큼 많은 스레드를 생성하고 스레드 간에 작업 부하를 균등하게 공유합니다.

관련 정보