문제

나는 많은 부동 소수점 작업으로 CPU 무거운 계산을하는 멀티 스레드 프로그램을 작성했습니다. 보다 구체적으로, 그것은 애니메이션 시퀀스를 프레임별로 비교하는 프로그램입니다. 즉 애니메이션 A의 모든 프레임에 대한 애니메이션 B의 모든 프레임과 애니메이션 A의 프레임 데이터를 비교합니다. A 애니메이션 A의 모든 프레임에 대해 다른 애니메이션에 대한이 집중 작업을 수행하므로 프로그램이 AB 쌍, BC 쌍 및 CA 쌍에서 작동 할 수 있습니다. 병행하여. 이 프로그램은 QTConcurrent와 "MAP"기능을 사용하여 컨테이너를 함수에 맵핑합니다. QTConcurrent는 나사를 위해 스레드 풀을 관리합니다. 저는 Intel Quad Core 프로세서에서 작업하여 4 개의 스레드를 생성합니다.

이제 문제는 내 프로세스가 내 CPU를 파괴한다는 것입니다. 사용량은 100% 일정하며 실제로 큰 동작 세트 (비 페이지 영역의 페이지 오류)에서 프로그램을 실행하면 실제로 블루 스크린을 얻습니다. 나는 이것이 내 컴퓨터가 오버 클럭 되었기 때문에 의심됩니다. 그러나 이것이 제가 프로그램을 코딩하는 방식 때문일 수 있습니까? 기계의 안정성을 테스트하는 데 사용한 매우 집중적 인 BenchAmrking 도구는 PC가 충돌하지 않았습니다. 내 프로그램이 내 CPU를 사용하여 부하를 줄이는 방법을 제어 할 수있는 방법이 있습니까? 아니면 내 문제를 오해하고 있습니까?

도움이 되었습니까?

해결책

여기에는 훌륭한 답변이 있습니다.

각 스레드가 적극적으로 최적화되지 않는 한, 많은 성능 튜닝을 수행 한 관점에서만 추가 할 수 있습니다.

장거리 자동차 경주와 비유하기 위해서는 두 가지 방법이 있습니다.

  1. 차를 더 빨리 만들게하십시오
  2. 더 적은 정지와 사이드 트립을 만듭니다

내 경험상, 처음으로 작성된 대부분의 소프트웨어는 가장 직접적인 경로를 취하는 것과는 거리가 멀다. 특히 소프트웨어가 커짐에 따라.

Kenneth Cochran이 말했듯이 프로그램에서 낭비 된주기를 찾으려면 결코 추측하지 마십시오. 그것이 문제가된다는 것을 증명하지 않고 무언가를 고치면, 당신은 추측에 투자합니다.

성능 문제를 찾는 인기있는 방법은 프로파일 러를 사용하는 것입니다.

그러나 나는 이것을 많이하고 내 방법은 다음과 같습니다. http://www.wikihow.com/optimize-your-program%27s-performance

다른 팁

오버 클로킹 PC는 모든 종류의 이상한 문제로 이어질 수 있습니다. 문제의 근본 원인이라고 의심되면 합리적인 범위에서 클럭을 클릭하고 테스트를 다시 시도하십시오.

또한 Windows (BSOD 때문에 OS가 더 이상 복구 할 수 없지만 거의 아는 사람)가있는 방식으로 RAM을 손상시킬 수있는 일종의 이상한 메모리 버그 일 수도 있습니다.

내가 생각할 수있는 또 다른 가능성은, 당신이 당신의 스레딩 구현에 약간의 오류가 있다는 것입니다.

그러나 처음에는 오버 클로킹 문제를보고 있습니다 ...

당신이 설명한 작업의 종류는 이미 매우 병렬화 가능합니다. 둘 이상의 작업을 실행하는 것은 실제로 할 수 있습니다 아프다 성능. 그 이유는 모든 프로세서의 캐시가 크기가 제한되어 있고 동시에 더 많이 시도할수록 각 스레드의 캐시 공유가 작기 때문입니다.

GPU를 사용하여 옵션을 살펴보고 처리로드를 흡수 할 수도 있습니다. 현대 GPU는 비슷한 세대의 CPU보다 대부분의 비디오 변환에 대해 훨씬 더 효율적입니다.

나는 이것이 내 컴퓨터가 오버 클럭 되었기 때문에 의심됩니다.

확실히 가능합니다. 잠시 동안 정상 속도로 설정하십시오.

이것이 제가 프로그램을 코딩하는 방식 때문일 수 있습니까?

사용자 모드에서 실행되는 프로그램은 BSOD를 유발할 가능성이 거의 없습니다.

추측 할 때, 나는 당신이 3 코어 머신 (또는 4, 100% 사용량이 주어진 4 개)을 실행하지 않았다고 말하며, 코어보다 더 많은 스레드를 사용하면 병렬화가 성능을 적극적으로 손상시킬 것입니다. CPU 코어 당 하나의 스레드 만, 무엇을 하든지 만듭니다. 다른 스레드에서 동시에 데이터에 액세스하지 마십시오.. 대부분의 멀티 코어 CPU의 캐시 잠금 알고리즘은 성능을 절대적으로 도축 할 것입니다. 이 경우 N 코어 CPU 처리 L- 프레임 애니메이션에서 프레임 0- (l/n), 프레임 (l/n)-(2*l/n)의 스레드 1에서 스레드 1을 사용합니다. .. 프레임 ((N-1)*L/N) -L의 스레드 N. 캐시를 시차하지 않도록 다른 조합 (AB, BC, CA)을 순서대로 수행하면 코드가 더 간단해야합니다.

부수적으로? 진짜 계산 이와 같이 ~해야 한다 100% CPU를 사용하고 있다면 최대한 빨리 진행되고 있음을 의미합니다.

오버 클로킹은 불안정성의 가장 큰 원인입니다. CPU 집중 알고리즘을 사용하면 일부 CPU 스래싱이있을 것입니다. 오버 클로킹은 견딜 수 없으며, 성능 병목 현상을 찾기 위해 좋은 성능 프로파일 러를 찾을 것입니다. 문제가 어디에 있는지 추측하지 마십시오. 성능에 실질적인 영향을 미치지 않는 것을 최적화하거나 성능이 악화되는 것을 최적화하는 데 몇 달을 소비 할 수 있습니다.

하드웨어를 비난하는 것은 너무 쉽습니다. 다른 시스템에서 프로그램을 실행하고 동일한 데이터로 어떻게 나타나는지 확인하는 것이 좋습니다.

아마도 당신은 버그가 있습니다.

SIMD 작업을 사용합니다. 이 경우 SSE를 원한다고 생각합니다. 그것들은 종종 평행보다 더 나은 첫 단계입니다. 왜냐하면 그들은 수정하기가 더 쉽고 대부분의 선형 대수 유형의 작업에 꽤 무거운 부스트를 제공하기 때문입니다.

SIMD를 사용하여 얻으면 병렬화를 살펴보십시오. CPU를 때리는 것처럼 들리므로 바쁜 대기 대신 잠을 잘 수있을 수 있으며 스레드를 제대로 청소하거나 재사용하는지 확인하십시오.

BSOD 오류 코드가 없으면 (찾아 보는 데 유용)이 코드를 도와주기가 조금 더 어렵습니다.

당신은 당신의 기억을 물리적으로 다시 사용하려고 시도 할 수 있습니다. 그것은 계속 충돌했습니다 ... 마침내 나는 기억을 터 뜨리고 다시 떨어 뜨 렸고 모든 것이 괜찮 았습니다.

수면 (1); CPU 사용량을 반으로 줄입니다. CPU 집중 알고리즘으로 작업하는 것과 동일한 문제가 발생했습니다.

프로세서가 두 개 이상의 코어가있는 경우 작업 관리자로 이동하여 프로세스로 이동하여 프로그램 이름을 마우스 오른쪽 버튼으로 클릭하고 클릭 할 수 있습니다. Set affinity 그리고 더 적은 코어를 사용하도록 프로그램을 설정하십시오.

그러면 요청하는 작업을 수행하는 데 시간이 더 걸리지 만 CPU 사용량이 크게 감소합니다.

커널 메모리 영역이 손상 될 때 사망의 블루 스크린이 발생한다고 생각합니다. 따라서 멀티 스레딩을 사용하여 병렬 작업을 수행하는 것이 그 이유는 아닙니다.

무거운 부동 소수점 작업을 운반하는 여러 스레드를 생성하는 경우 CPU 사용이 최대 100%에 도달합니다.

다른 과정에서 기회를 얻도록 각 스레드에서 약간의 수면을 줄 수 있다면 더 나을 것입니다. 스레드의 우선 순위를 줄이려고 시도 할 수도 있습니다.

Windows 플랫폼에서 CPU를 알리기 위해 한 번의 호출을 수행 한 후 CPU를 다른 프로세스로 만들려고합니다. 그런 다음과 같은 수면 기능을 호출하십시오.

SLEPP (0);

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top