[c] C 프로그램에서 100 % CPU 사용량을 얻는 방법

이것은 매우 흥미로운 질문이므로 장면을 설정하겠습니다. 저는 The National Museum of Computing에서 일하고 있으며 1992 년부터 Cray Y-MP EL 슈퍼 컴퓨터를 실행하는 데 성공했습니다. 얼마나 빨리 작동하는지보고 싶습니다!

이를 수행하는 가장 좋은 방법은 소수를 계산하는 데 걸리는 시간을 보여주는 간단한 C 프로그램을 작성한 다음 최신 데스크톱 PC에서 프로그램을 실행하고 결과를 비교하는 것입니다.

우리는 소수를 계산하기 위해이 코드를 빨리 생각해 냈습니다.

Ubuntu (The Cray는 UNICOS를 실행)를 실행하는 듀얼 코어 랩톱에서 완벽하게 작동하여 100 % CPU 사용량을 얻고 약 10 분 정도 소요되었습니다. 집에 돌아 왔을 때 저는 헥스 코어 최신 게임용 PC에서 사용해보기로 결정했고, 여기에서 첫 번째 호를 얻었습니다.

처음에는 Windows에서 실행되도록 코드를 수정했는데, 게임용 PC가 사용하는 것이었기 때문에 프로세스가 CPU 성능의 약 15 % 만 얻는다는 사실에 슬펐습니다. Windows가 Windows 여야한다고 생각했기 때문에 Ubuntu의 Live CD로 부팅하여 Ubuntu가 이전에 랩톱에서했던 것처럼 프로세스가 최대한의 잠재력을 발휘할 수 있도록 할 것이라고 생각했습니다.

그러나 나는 단지 5 % 사용을 얻었습니다! 제 질문은 Windows 7 또는 라이브 Linux에서 100 % CPU 사용률로 내 게임 머신에서 실행되도록 프로그램을 조정하는 방법입니다. 훌륭하지만 필요하지 않은 또 다른 것은 최종 제품이 Windows 시스템에서 쉽게 배포되고 실행될 수있는 하나의 .exe 일 수있는 경우입니다.

감사합니다!

추신 물론이 프로그램은 Crays 8 전문가 프로세서에서 작동하지 않았습니다. 이것은 완전히 다른 문제입니다. 90 년대 Cray 슈퍼 컴퓨터에서 작동하도록 코드를 최적화하는 방법에 대해 알고 계신다면 한마디 부탁드립니다!



답변

100 % CPU를 원하면 2 개 이상의 코어를 사용해야합니다. 이를 위해서는 여러 스레드가 필요합니다.

OpenMP를 사용하는 병렬 버전은 다음과 같습니다.

1000000내 컴퓨터에서 1 초 이상 걸리도록 제한을 늘려야했습니다 .

산출:

이 기계는 29.753 초에 1000000 미만의 모든 78498 소수를 계산했습니다.

100 % CPU는 다음과 같습니다.

여기에 이미지 설명 입력


답변

멀티 코어 머신에서 하나의 프로세스를 실행하고 있으므로 하나의 코어에서만 실행됩니다.

프로세서를 고정하려고하기 때문에 솔루션은 충분히 쉽습니다. N 개의 코어가있는 경우 프로그램을 N 번 실행합니다 (물론 병렬로).

다음은 프로그램 NUM_OF_CORES시간을 병렬로 실행하는 코드입니다 . POSIXy 코드입니다-사용 fork하므로 Linux에서 실행해야합니다. 내가 Cray에 대해 읽고있는 것이 정확하다면 다른 답변의 OpenMP 코드 보다이 코드를 포팅하는 것이 더 쉬울 수 있습니다.

산출


답변

우리는 그것이 얼마나 빨리 갈 수 있는지 정말로보고 싶습니다!

소수를 생성하는 알고리즘은 매우 비효율적입니다. 그것을 비교 primegen 즉 펜티엄 II-350에 단 8 초 만에 1000000000로 50847534 개 소수를 생성합니다.

모든 CPU를 쉽게 소비하려면 다음을 해결할 수 있습니다. Mandelbrot 집합을 계산 하거나 유전 프로그래밍을 사용 하여 여러 스레드 (프로세스)에서 Mona Lisa를 칠 난처한 병렬 문제를 .

또 다른 접근 방식은 Cray 슈퍼 컴퓨터에 대한 기존 벤치 마크 프로그램을 최신 PC에 이식하는 것입니다.


답변

헥스 코어 프로세서에서 15 %를 얻는 이유는 코드가 100 %에서 1 코어를 사용하기 때문입니다. 100/6 = 16.67 %, 프로세스 스케줄링과 함께 이동 평균 (프로세스가 보통 우선 순위로 실행 됨)을 사용하면 15 %로 쉽게보고 될 수 있습니다.

따라서 100 % cpu를 사용하려면 CPU의 모든 코어를 사용해야합니다. 16 진수 코어 CPU에 대해 6 개의 병렬 실행 코드 경로를 시작하고 Cray 머신이 보유한 프로세서 수까지이 확장 성을 갖춰야합니다. 🙂


답변

또한 CPU를로드하는 방법 을 잘 알고 있어야 합니다 . CPU는 많은 다른 작업을 수행 할 수 있으며 많은 작업이 “CPU 100 %로드”로보고되지만 각각 CPU의 다른 부분을 100 % 사용할 수 있습니다. 즉, 성능면에서 두 개의 다른 CPU, 특히 두 개의 다른 CPU 아키텍처를 비교하는 것은 매우 어렵습니다. 작업 A를 실행하면 한 CPU가 다른 CPU보다 선호 될 수 있지만 작업 B를 실행하면 쉽게 반대가 될 수 있습니다 (두 CPU가 내부적으로 다른 리소스를 가질 수 있고 코드를 매우 다르게 실행할 수 있기 때문입니다).

이것이 하드웨어만큼이나 컴퓨터가 최적의 성능을 발휘하도록 만드는 데 소프트웨어가 중요한 이유입니다. 이것은 “슈퍼 컴퓨터”에서도 마찬가지입니다.

CPU 성능에 대한 한 가지 척도는 초당 명령 일 수 있지만 명령은 다른 CPU 아키텍처에서 동일하게 생성되지 않습니다. 또 다른 측정은 캐시 IO 성능 일 수 있지만 캐시 인프라도 같지 않습니다. 그런 다음 클러스터 컴퓨터를 설계 할 때 전력 공급 및 손실이 제한 요소 인 경우가 많으므로 측정은 사용 된 와트 당 명령 수일 수 있습니다.

따라서 첫 번째 질문은 다음과 같습니다. 중요한 성능 매개 변수는 무엇입니까? 무엇을 측정 하시겠습니까? Quake 4에서 가장 많은 FPS를 얻을 수있는 컴퓨터를보고 싶다면 대답은 간단합니다. Cray가 해당 프로그램을 전혀 실행할 수 없기 때문에 게임 장비가 작동합니다 😉

건배, 스틴


답변

TLDR; 받아 들여지는 대답은 비효율적이며 양립 할 수 없습니다. 다음 알고리즘은 100 배 더 빠르게 작동합니다 .

MAC에서 사용할 수있는 gcc 컴파일러는 실행할 수 없습니다 omp. llvm을 설치해야했습니다 (brew install llvm ). 그러나 OMP 버전을 실행하는 동안 CPU 유휴 상태가 떨어지는 것을 보지 못했습니다 .

다음은 OMP 버전이 실행되는 동안의 스크린 샷입니다.
여기에 이미지 설명 입력

또는 c 컴파일러를 사용하여 실행할 수있는 기본 POSIX 스레드를 사용했으며nos of thread = no of cores= 4 (MacBook Pro, 2.3GHz Intel Core i5) 일 때 거의 전체 CPU를 사용했습니다 . 다음은 프로그램입니다.

전체 CPU가 어떻게 사용되는지 확인하십시오.
여기에 이미지 설명 입력

추신-스레드 수를 늘리지 않으면 시스템이 실제 컴퓨팅보다 컨텍스트 전환에 더 많은 시간을 사용하기 때문에 실제 CPU 사용량이 감소합니다 (스레드 수 = 20.).

그건 그렇고, 내 컴퓨터는 @mystical (수락 된 대답)만큼 비싸지 않습니다. 그러나 기본 POSIX 스레딩을 사용하는 내 버전은 OMP보다 훨씬 빠르게 작동합니다. 결과는 다음과 같습니다.

여기에 이미지 설명 입력

PS 스레드로드를 250 만 개로 늘려 CPU 사용량을 확인합니다. 완료되는 데 1 초도 걸리지 않습니다.


답변

예를 들어 OpenMP를 사용하여 프로그램을 병렬화하십시오. 병렬 프로그램을 만들기위한 매우 간단하고 효과적인 프레임 워크입니다.