IT

“CPU 바운드”및“I / O 바운드”라는 용어는 무엇을 의미합니까?

lottoking 2020. 3. 28. 10:43
반응형

“CPU 바운드”및“I / O 바운드”라는 용어는 무엇을 의미합니까?


"CPU 바운드"및 "I / O 바운드"라는 용어는 무엇을 의미합니까?


매우 직관적입니다.

CPU가 더 빠르면 프로그램이 더 빨라지면 프로그램이 CPU에 바운드됩니다. 즉, 대부분의 시간을 단순히 CPU를 사용하여 계산합니다 (계산 수행). 새로운 π의 자릿수를 계산하는 프로그램은 일반적으로 CPU에 한정되며 크런치 숫자입니다.

I / O 서브 시스템이 더 빠르면 프로그램이 더 빨라질 경우 프로그램은 I / O에 바인딩됩니다. 정확한 I / O 시스템의 의미는 다를 수 있습니다. 일반적으로 디스크와 디스크를 연결하지만 일반적으로 네트워킹 또는 통신도 일반적입니다. 병목 현상은 디스크에서 데이터를 읽는 것이므로 실제로 일부 파일에 대해 큰 파일을 살펴 보는 프로그램은 I / O 바운드가 될 수 있습니다. SSD에서 제공).


CPU 바운드 는 프로세스 진행률이 CPU 속도에 의해 제한됨을 의미합니다. 작은 숫자를 곱하는 것과 같이 작은 숫자 집합에서 계산을 수행하는 작업은 CPU에 바인딩 된 것 같습니다.

I / O 바운드 는 프로세스가 진행되는 속도가 I / O 하위 시스템의 속도에 의해 제한됨을 의미합니다. 예를 들어, 파일의 행 수를 계산하는 것과 같이 디스크에서 데이터를 처리하는 작업은 I / O 바인딩 될 수 있습니다.

메모리 바운드 는 프로세스가 진행되는 속도가 사용 가능한 메모리 양과 해당 메모리 액세스 속도에 의해 제한됨을 의미합니다. 예를 들어 큰 행렬을 곱하는 것과 같이 많은 양의 메모리 데이터를 처리하는 작업은 메모리 바운드 일 수 있습니다.

캐시 바운드 는 프로세스 진행률이 사용 가능한 캐시의 양과 속도에 의해 제한되는 비율을 의미합니다. 캐시에 맞는 것보다 더 많은 데이터를 단순히 처리하는 작업은 캐시에 바인딩됩니다.

I / O 바운드는 메모리 바운드보다 느리고 캐시 바운드는 CPU 바운드보다 느립니다.

I / O 바인딩 솔루션이 반드시 더 많은 메모리를 확보 할 필요는 없습니다. 경우에 따라 액세스 알고리즘은 I / O, 메모리 또는 캐시 제한을 중심으로 설계 될 수 있습니다. 캐시 알 수없는 알고리즘을 참조하십시오 .


멀티 스레딩

이 답변에서는 다중 스레드 코드를 작성할 때 CPU와 IO 경계 작업을 구별하는 중요한 사용 사례를 조사합니다.

RAM I / O 바운드 예 : 벡터 합계

단일 벡터의 모든 값을 합하는 프로그램을 생각해보십시오.

#define SIZE 1000000000
unsigned int is[SIZE];
unsigned int sum = 0;
size_t i = 0;
for (i = 0; i < SIZE; i++)
    /* Each one of those requires a RAM access! */
    sum += is[i]

각 코어에 대해 어레이를 균등하게 분할하여 일반적인 최신 데스크톱에서는 유용성이 제한됩니다.

예를 들어, Ubuntu 19.04, CPU가 장착 된 Lenovo ThinkPad P51 랩탑 : Intel Core i7-7820HQ CPU (4 코어 / 8 스레드), RAM : 2x Samsung M471A2K43BB1-CRC (2x 16GiB) 결과는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

데이터를 플롯합니다 .

그러나 실행 간에는 많은 차이가 있습니다. 그러나 이미 8GiB에 있기 때문에 어레이 크기를 훨씬 더 늘릴 수 없으며 오늘날 여러 번 실행되는 통계에 대한 기분이 들지 않습니다. 그러나 이것은 많은 수동 실행을 한 후 일반적인 실행처럼 보였다.

벤치 마크 코드 :

곡선의 모양을 완전히 설명하기에 충분한 컴퓨터 아키텍처를 알지 못하지만 한 가지 분명합니다. 8 개의 스레드를 모두 사용하기 때문에 계산이 순진하게 예상대로 8 배 빠르지 않습니다! 어떤 이유로 2/3 스레드가 최적이었고 더 많이 추가하면 작업 속도가 훨씬 느려집니다.

실제로 8 배 더 빠른 CPU 바운드 작업과 비교해보십시오. 시간의 결과에서 '실제', '사용자'및 'sys'는 무엇을 의미합니까?

모든 프로세서가 RAM에 연결되는 단일 메모리 버스를 공유하는 이유는 다음과 같습니다.

CPU 1   --\    Bus    +-----+
CPU 2   ---\__________| RAM |
...     ---/          +-----+
CPU N   --/

따라서 메모리 버스는 CPU가 아닌 병목 현상이 빠르게 발생합니다.

두 개의 숫자를 추가하면 단일 CPU주기가 걸리고 메모리 읽기 는 2016 하드웨어에서 100 개의 CPU주기가 필요하기 때문에 발생 합니다.

따라서 입력 데이터의 바이트 당 수행되는 CPU 작업이 너무 작으므로이를 IO 바인딩 프로세스라고합니다.

계산 속도를 높이는 유일한 방법은 새로운 메모리 하드웨어 (예 : 다중 채널 메모리)를 사용 하여 개별 메모리 액세스 속도를 높이는 것 입니다.

예를 들어 더 빠른 CPU 클럭으로 업그레이드하는 것은 그리 유용하지 않습니다.

다른 예

  • 행렬 곱셈은 RAM 및 GPU에서 CPU에 바인딩됩니다. 입력 내용 :

    2 * N**2
    

    숫자이지만

    N ** 3
    

    곱셈이 이루어지고, 그것은 병렬화가 실질적인 큰 N에 대한 가치가 있기에 충분합니다.

    이것이 다음과 같은 병렬 CPU 매트릭스 곱셈 라이브러리가 존재하는 이유입니다.

    캐시 사용은 구현 속도에 큰 차이를 만듭니다. 예를 들어이 교훈적인 GPU 비교 예를 참조하십시오 .

  • GPU는 데이터를 CPU로 전송하는 데 IO 병목 현상이 발생합니다.

    CPU 왕복을 피하기 위해 렌더 출력 (픽셀 사각형)을 비디오 메모리로 직접 출력 할 수 있도록 설계되었습니다.

  • 네트워킹은 프로토 타입 IO 바운드 예제입니다.

    단일 바이트의 데이터를 보내더라도 대상에 도달하는 데 여전히 많은 시간이 걸립니다.

    HTTP 요청과 같은 소규모 네트워크 요청을 병렬화하면 성능이 크게 향상 될 수 있습니다.

    네트워크가 이미 전체 용량에 도달 한 경우 (예 : 토렌트 다운로드) 병렬화로 인해 대기 시간이 향상 될 수 있습니다 (예 : 웹 페이지를 "동시에"로드 할 수 있음).

  • 하나의 숫자를 취하고 많이 버리는 더미 C ++ CPU 바운드 작업 :

CPU 또는 IO 바운드인지 확인하는 방법

비-RAM IO 디스크, 네트워크 같은 바인딩 : ps aux다음 theck 경우 CPU% / 100 < n threads. 그렇다면 IO 제한입니다. 예를 들어 차단 read은 데이터를 기다리는 중이며 스케줄러는 해당 프로세스를 건너 뜁니다. 그런 다음 추가 도구를 사용 sudo iotop하여 정확히 어떤 IO가 문제인지 결정하십시오.

또는 실행이 빠르고 스레드 수를 매개 변수화하면 timeCPU 바운드 작업의 스레드 수가 증가함에 따라 성능이 향상 되는 것을 쉽게 알 수 있습니다 . '실제', '사용자'및 'sys'의 의미 시간의 출력 (1)?

RAM-IO 바운드 : RAM 대기 시간이 CPU%측정에 포함되므로 알기가 어렵습니다 .

일부 옵션 :

CPython 글로벌 정수기 잠금 (GIL)

빠른 사례 연구로서, 파이썬 GIL (Global Interpreter Lock) : CPython의 GIL (Global Interpreter Lock) 이란 무엇입니까?

이 CPython 구현 세부 사항은 여러 Python 스레드가 CPU 바운드 작업을 효율적으로 사용하지 못하게합니다. 의 CPython 문서는 말한다 :

CPython 구현 세부 사항 : CPython에서는 Global Interpreter Lock으로 인해 한 번에 하나의 스레드 만 Python 코드를 실행할 수 있습니다 (특정 성능 지향 라이브러리가이 한계를 극복 할 수 있음에도 불구하고). 당신이 멀티 코어 시스템의 컴퓨팅 자원을보다 효율적으로 사용할 수 있도록 응용 프로그램을 원하는 경우 사용하는 것이 좋습니다 multiprocessing또는 concurrent.futures.ProcessPoolExecutor. 그러나 여러 I / O 바운드 작업을 동시에 실행하려는 경우 스레딩은 여전히 ​​적절한 모델입니다.

따라서 여기에 CPU 바인딩 컨텐츠가 적합하지 않고 I / O 바인딩이 적합한 예가 있습니다.


CPU 바운드는 프로그램이 CPU 또는 중앙 처리 장치에 의해 병목 현상을 발생시키는 반면, I / O 바운드는 프로그램이 I / O에 의해 병목 현상을 일으키거나 디스크, 네트워크에 대한 읽기 또는 쓰기 등의 입 / 출력을 의미합니다.

일반적으로 컴퓨터 프로그램을 최적화 할 때 병목 현상을 찾아 제거합니다. 프로그램이 CPU에 속한다는 것을 알면 불필요하게 다른 것을 최적화하지 않아도됩니다.

[그리고 "병목 현상"이란 프로그램이 다른 것보다 느리게 만드는 것을 의미합니다.]


같은 생각을 표현하는 또 다른 방법 :

  • CPU 속도를 높여도 프로그램 속도가 빨라지지 않으면 I / O 바인딩 된 것일 수 있습니다 .

  • I / O 속도를 높이면 (예 : 빠른 디스크 사용) 도움이되지 않으면 프로그램이 CPU에 바인딩 된 것일 수 있습니다.

(다른 리소스를 고려해야하기 때문에 "아마도"를 사용했습니다. 메모리가 한 예입니다.)


프로그램이 I / O를 기다리는 경우 (예 : 디스크 읽기 / 쓰기 또는 네트워크 읽기 / 쓰기 등) CPU는 프로그램이 중지 된 경우에도 다른 작업을 자유롭게 수행 할 수 있습니다. 프로그램 속도는 대부분 IO가 얼마나 빨리 발생할 수 있는지에 달려 있으며 속도를 높이려면 I / O 속도를 높여야합니다.

프로그램이 많은 프로그램 명령을 실행 중이고 I / O를 기다리지 않으면 CPU에 바인딩 된 것으로 간주됩니다. CPU 속도를 높이면 프로그램이 더 빨리 실행됩니다.

두 경우 모두 프로그램 속도를 높이는 열쇠는 하드웨어 속도를 높이는 것이 아니라 필요한 IO 또는 CPU의 양을 줄이거 나 CPU를 많이 사용하면서 I / O를 수행하도록 프로그램을 최적화하는 것입니다. 물건.


I / O 바운드는 계산을 완료하는 데 걸리는 시간이 입력 / 출력 작업이 완료되기를 기다리는 데 소요 된 기간에 의해 주로 결정되는 조건을 나타냅니다.

이것은 CPU 바운드 작업의 반대입니다. 이 상황은 데이터 요청 속도가 소비 속도보다 느리거나 데이터를 처리하는 것보다 데이터를 요청하는 데 더 많은 시간이 소요되는 경우에 발생합니다.


IO 바운드 프로세스 : 계산보다 IO에 더 많은 시간을 보내고 많은 CPU 버스트가 있습니다. CPU 바운드 프로세스 : 계산에 더 많은 시간을 소비하고 매우 긴 CPU 버스트


I / O 바운드 프로세스 :-프로세스 수명의 대부분이 I / O 상태로 소비되는 경우 프로세스는 a / o 바운드 프로세스입니다. 예 : -calculator, 인터넷 탐색기

CPU 바운드 프로세스 :-프로세스 수명의 대부분이 CPU에 소비되면 CPU 바운드 프로세스입니다.

참고 URL : https://stackoverflow.com/questions/868568/what-do-the-terms-cpu-bound-and-io-bound-mean

반응형