할 큰 계산이 있습니다. 모든 코어를 활용할 수는 있지만 코어 1 개를 사용하지 말아야 할 이유가 있습니까? (계산 CPU 만 IO 없음). 아니면 모든 코어를 사용하더라도 적절한 컨텍스트 전환을 처리하고 수행 할 수없는 OS를 과소 평가합니까?
할 큰 계산이 있습니다. 모든 코어를 활용할 수는 있지만 코어 1 개를 사용하지 말아야 할 이유가 있습니까? (계산 CPU 만 IO 없음). 아니면 모든 코어를 사용하더라도 적절한 컨텍스트 전환을 처리하고 수행 할 수없는 OS를 과소 평가합니까?
답변:
주요 운영 체제는 사용 가능한 모든 코어를 사용하는 프로세스를 처리하는 방법을 알기에 충분히 성숙합니다. 다른 프로세스도 영향을받을 수 있으며 종종 사용 가능한 모든 코어를 사용했기 때문에 계산 속도가 느려지지 않습니다.
코어 수의 선택은 계산을 수행하는 동안 다른 작업을 수행하려는 의도에 따라 다릅니다.
데스크톱 컴퓨터에서 계산을 수행하는 동안 웹 브라우저를 사용하거나 비디오를 볼 수있게하려면 하나의 코어를 무료로 유지하는 것이 좋습니다. 마찬가지로, 서버가 계산을 수행하고 동시에 메트릭을 처리 및보고하는 등 두 가지 작업을 수행하는 경우 부수적 작업에 핵심을 유지하는 것이 좋습니다.
반면에 계산을 최대한 빨리하는 것이 우선이라면 모든 코어를 사용해야합니다.
때에 따라 다르지.
머신이이 계산 전용이라면 모든 코어를 사용해야합니다. 사용 하지 않는 컴퓨팅 리소스는 속도를 높이 지 않습니다 .
실시간 스케줄러, 비 선점 스케줄러 또는 프로세서 선호도를 사용하는 경우 실수로 모든 컴퓨팅 리소스에서 다른 프로세스를 고갈시키기 쉽기 때문에 좀 더주의해야합니다. 그러나 문제가 발생하기 위해 이러한 설정을 수동으로 변경해야하므로 기본적으로 대부분의 OS에서 아무런 문제가 없습니다.
기계가 계산 전용이 아닌 경우 계산에 100 %를 제공하는 것이 이상적이지 않을 수 있습니다. 예를 들어 계산이 실행되는 동안 웹 브라우저를 사용하는 경우 기계의 하중이 때때로 100 %를 초과하기 때문에 부진하게 느껴질 것입니다. 계산과 같은 처리량 지향 작업은 실제로 느려지지 않지만 GUI와 같은 대기 시간에 민감한 작업은 빠르게 반응하지 않습니다. 그런 다음 계산을 위해 NPROC-1 스레드 / 프로세스 만 시작하는 것이 합리적입니다. 또는 일반 작업보다 계산에 우선 순위가 낮은 것을 명시 적으로 사용하면이 문제를 해결할 수 있습니다.이 경우 계산시 NPROC 프로세스를 사용하여 리소스를 낭비하지 않아야합니다.
nice
.
그의 부정적인 투표로 인해 아래의 @motoDrizzt에 동의하는 것에 대해 다소 신중한 생각입니다. 예를 들어 http://www.forkosh.com/images/avoronoi.gif 에서 3D-voronoi_diagram의 각 2D 평면을 독립적으로 생성 할 수 있습니다. 그리고 프로그램은 nfork = n query_string 속성을 사용하여 n 개의 평면에 대한 계산을 "동시에" 분기합니다 .
4 코어 프로세서를 사용하면 다이어그램을 완성하는 (사용자) 시간이 nfork와 거의 선형 적으로 줄어 듭니다. 약 nfork = 8 (4 코어 하이퍼 스레딩). 그러나 8을 넘어 서면 시간은 여전히 느리지 만 줄어 듭니다. 그리고 16 이상 정도면 더 이상 눈에 띄는 개선이 없습니다. 나는이 동작을 전혀 분석하지 않았지만 전체 유휴 시간을 더욱 줄이기 위해 프로세스를 저글링하는 os (이 경우 Linux slackware 14.2x64)에 순진하게 귀속됩니다.
최선의 선택은 시스템에 따라 다릅니다. 따라서 실제 시스템에서 두 버전을 모두 실행 한 다음 시스템이 어떻게 반응하는지 확인해야합니다. 여전히 시스템에서 브라우저, 텍스트 편집기 등을 사용할 수 있습니까? 그리고 n-1이 아닌 n 스레드를 사용할 때 성능이 더 좋습니까? 모든 CPU를 사용하려고하는 다른 앱과 함께 앱을 실행하면 어떻게됩니까?
그런 다음 하이퍼 스레딩을 고려해야합니다. 4 개의 코어와 하이퍼 스레딩을 사용하면 8 개의 코어 또는 7 개의 코어를 사용할 수 있습니다. 다시 한 번 시스템의 응답 성과 완료 시간을 시험해보십시오.
마지막으로 작업을 스레드보다 더 많은 블록으로 나누는 것을 고려하십시오. 그 이유는 다른 스레드가 다른 시간에 작업을 완료 한 다음 일부 작업을 더 빠른 스레드로 처리하기를 원하기 때문입니다. 그렇지 않으면 마지막 스레드가 끝날 때까지 기다려야합니다.
추신. "하이퍼 스레딩은 FPU가 하나뿐이므로 FPU 집약적 코드에는 도움이되지 않습니다." 절대적으로 틀렸다. 지연 시간으로 인해 FPU를 많이 사용하는 코드를 사용하더라도 FPU를 최대한 활용하는 것은 매우 어렵습니다. 하이퍼 스레딩은 예약에 사용할 수있는 독립적 인 작업이 두 배나 많기 때문에 도움이됩니다.
나는 "나쁜"소리를 내지 않는 방식으로 이것을 작성하는 방법을 모른다, 그래서 그냥 친근한 말로 받아 들여라.
평균 PC에 보통 수천 개 이상의 스레드가 있다고 가정하면 8 대 7을 사용하면 차이가 있다고 생각하는 이유는 무엇입니까? :-)
가능한 많은 스레드를 사용하십시오. 또한 OS 응답에 신경 쓸 필요가없고 스레드가 1 초 이상 상당히 오랜 시간 동안 실행되면 코어 수의 두 배를 사용하여 실험 할 수도 있습니다.