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


79

이것은 매우 흥미로운 질문이므로 장면을 설정하겠습니다. 저는 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 슈퍼 컴퓨터에서 작동하도록 코드를 최적화하는 방법에 대해 알고 계신다면 한마디 부탁드립니다!


8
나는 unicos 태그 가 없다는 것을 믿을 수 없습니다 . ;)
Edward Thomson

32
이 단일 스레드 프로그램이 DUAL CORE 프로세서에서 CPU 사용량의 100 %를 차지한다는 것은 이상한 일입니다.)))
mikithskegg

24
이 질문이 전혀 흥미 롭다고 생각하지 않는 유일한 사람입니까? 은 1 / n은 CPU를 사용하는 이유 N 코어 시스템에서 단일 스레드 프로그램을 실행하고 묻는 일을 와서 그냥 ... 결코 마음을, 나는 단지 downvote :-)
군터 Piez

16
@drhirsch 글쎄, 질문은 연구 노력을 보여줍니다. 나는 그것을 위해 +1했다-OP가 멀티 코어 컴퓨팅에 대한 근본적인 것을 놓친 경우에도.
Mysticial

9
@drhirsch 사이트에는 흥미롭지 않은 질문이 많이 있습니다. 그러나 흥미 롭거나 그렇지 않은 것은 주관적입니다. 그는 기본을 놓치고있을 수 있으며 주관적이지 않습니다. Mystical이 말했듯이, 그것은 연구 노력을 보여주고 나타나는 것처럼 대답하기 쉽지 않습니다.
Carl

답변:


81

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

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

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

산출:

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

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

여기에 이미지 설명 입력


1
@ cha0site 네, 주로 게임기에 대한 질문에 대답했습니다. CPU를 고정하는 더 흥미로운 방법이 있습니다. 제가 한 가장 악명 높은 벤치 마크 중 하나는 이 질문에 대한 제 답변 입니다. 테스트 한 4 대의 컴퓨터 중 2 대가 과열되었습니다.
Mysticial

1
@Mystical Offtopic : 어떤 하드웨어를 실행하고 있습니까? 내 Hex-Core AMD @ 3.2Ghz가 92 초 만에 완료했습니다 ...
bag-man

1
@Owen : 그는 Core i7 2600K를 가지고 있습니다 ... 나는 질투합니다.
cha0site

19
Augh! 너무 ... 많이 ... 핑크!
Mateen Ulhaq 2012

2
@MohammadFadin en.wikipedia.org/wiki/Parallel_computing 기본적으로 멀티 코어 컴퓨터를 활용하려면 여러 작업을 병렬로 처리 할 수 ​​있어야합니다.
Mysticial

24

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

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

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

산출


아, Prime95를 실행해야 할 때와 마찬가지로 여러 인스턴스가 있습니다. 하나의 프로세스가 여러 코어를 사용하는 방법이 있습니까? 해시 크래킹 프로그램처럼.
bag-man

글쎄, 하나의 프로세스는 스레드를 사용하여 다중 처리를 수행 할 수 있지만 스레드는이 컨텍스트에서 거의 별도의 프로세스이기 때문에 이것이 의미하는 바라고 생각하지 않습니다. 여기서 우리가 실제로 이야기하고있는 것은 "실행 헤드", 스레드 또는 프로세스입니다. 따라서 아니요, 단일 스레드 프로그램을 여러 코어에서 실행하는 방법이 없습니다. 다시 작성해야합니다. 그리고 때로는 정말 어렵습니다. 그리고 때로는 실제로 불가능합니다.
cha0site

프로그램이 Cray를 위해 작동하도록하는 것만 큼 어렵지는 않을 것 같습니다. 내가 이것에 꽤 새로운 것을 고려할 때 (What gave me away : P) 시작하기 좋은 곳은 어디입니까?
bag-man

@Owen : 글쎄, UNICOS그것은 유닉스와 다소 비슷한 것 같습니다 (위키피디아는 어쨌든 그렇게 생각합니다), 아마도 fork(). 그걸 사용하는 법을 배워야한다고 생각합니다.
cha0site

2
우! 이제 예가 있으므로 +1했습니다. :)
Mysticial

7

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

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

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

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


목표가 실제로 소수를 계산하는 것이 아니기 때문에 알고리즘이 비효율적이라는 것은 중요하지 않습니다. 일반적으로 어려운 작업을 수행하고 최신 데스크톱보다 얼마나 나은지 또는 나쁜지 확인하는 것입니다. 효율적인 알고리즘은 그 비교를 더 어렵게 만들고, 너무 좋으면 결과를 망칠 수도있어서 의도적으로 최신 CPU 기능 / 특징을 활용합니다.
Numeron

5

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

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


이렇게하면 각 기계의 속도에 대한 명확한 수치를 어떻게 얻을 수 있습니까? 그것은이보다 부하가 더 많은 작업을 필요로 제대로 실행 얻을 수 있도록 또한 크레이는 분명히 "벡터 프로세서"가
가방 남자

모르겠다. 아마도 스케줄링 프로세스의 차이 일 것입니다.
Carl

2

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

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

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

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

건배, 스틴


2

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 초도 걸리지 않습니다.


0

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


0

하나의 코어를 빠르게 개선하려면 시스템 호출을 제거하여 컨텍스트 전환을 줄이십시오. 다음 줄을 제거하십시오.

첫 번째는 반복 할 때마다 새 프로세스를 생성하므로 특히 나쁩니다.


0

큰 파일을 압축 및 압축 해제하기 만하면됩니다. 무거운 I / O 작업으로 CPU를 사용할 수있는 것은 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.