병렬화 계산에서 CPU 코어가 각 커널에 어떻게 분산됩니까?
질문하기 전에 내가 올바르게 이해했는지 확인하고 싶습니다. 어떤 사람들은 Mathematica의 일부 기능이 자동으로 멀티 코어를 사용한다고 말하는 것을 보았습니다 (나는 병렬화하는 기능을 언급하는 것이 아니라 같은 기능을 참조합니다 NIntegrate
). 그래서 2 개의 코어가 있으면 싱글보다 빠를 것 같습니다 핵심. 그래서 내 질문은 다음과 같은 코드가 있는지입니다.ParallelTable[NIntegrate[x, {x, 1, 3}], {loop, 1, 3}]
3 개의 커널이 시작될 것 같습니다. 4 개의 코어가있는 경우이 4 개의 코어가 각 커널에 어떻게 배포됩니까? (함수 통합 특성에 따라 각 커널이 멀티 코어를 사용할 수 있다고 생각하므로)
답변
환영합니다 noo-b, m.se는 M에 대한 무한 학습을위한 훌륭한 커뮤니티입니다!
나는 당신이 몇 가지 잘못된 가정을 가지고 있다고 생각합니다.
첫째, 단일 스레드 작업도 여러 코어에서 스레드 될 수 있습니다. 좋은 운영 체제는이를 피하려고하지만 몇 초마다 다른 코어로 전환하거나로드를 여러 코어로 분할 할 수 있습니다.
둘째, NIntegrate가 모든 입력에 대해 항상 병렬화 할 것이라고 가정 할 수 없으며, 특히 NIntegrate가 전체 계산 시간 동안 병렬화 할 것이라고 가정 할 수 없습니다. 초기화 또는 종료시 또는 그 사이의 선택 작업에 대해서만 병렬화 할 수 있습니다. 예를 들면
Do[Do[NIntegrate[x,{x,1,3}],{3}],{100000}]
핵심 활용도를 보면 (단순 작업 관리자와 같은 프로세스 활용도가 아님)-Linux를 사용하는 경우 top을 실행하고 1을 누를 수 있습니다 .-- 이것이 99 %의 시간을 소비하는 것을 볼 수 있습니다. 하나의 코어. 시간이 지나면 코어가 전환 될 수 있지만 해당 코어에 대해 99 %가 표시 됩니다. 그래서 적어도 항상 (아마도 몇 초 동안) 여러 코어에서 NIntegrate 스레딩을 전혀 보지 못합니다. 이것은 NIntegrate 입력에 따라 다를 수 있지만이 간단한 예제는 NIntegrate가 계산의 전체 기간 동안이 아니라 항상 병렬화되지 않음을 보여줍니다.
M 병렬화 프레임 워크를 사용하면 이것은 변경되지 않으며 실제로 운영 체제 문제입니다. ParallelTable (및 형제)을 사용하면 더 많은 프로세스에서 처리 작업을 제공하고 O / S가 코어에이를 예약하는 방법은 전적으로 O / S에 달려 있습니다. 따라서 병렬 프로세스에 대한 이해에서 코어에 대한 할당을 실제로 "취소"할 수 없습니다.
다소 접선 :
Scala, Java 또는 C # (또는 기타 여러 언어)에서는 스레드 수준에서 작업을 예약 할 수 있습니다. 그러나 그럼에도 불구하고 코어에 트레드를 예약하는 것은 O / s에 달려 있습니다. Java의 vmstat를 사용하면 스레드 (시간이 지남에 따라 증가하는 가로 막대, 스레드 당 하나씩)를 멋지게 시각화 할 수 있습니다. 정말로 관심이있는 것은 스레드가 코어에 할당되는 방식이 아니라 스레드에서 작동하는 방식이라고 생각합니다. . 하지만 스레드는 하드웨어 개념이 아니라 소프트웨어 개념이며 코어는 스레드가 무엇인지 모릅니다. 그러나 스레드 분석은 코어에 대한 할당과 코어 스위칭 및 모든 코어에 대한 워크로드 비율이 전적으로 O / s에 달려 있기 때문에 동시성을 이해하는 데 더 많은 것을 알려줄 것이라고 생각합니다.
다중 코어를 자동으로 사용하는 몇 가지 기능이 있습니다. 사용하는 코어 수는의 일부 설정에 따라 결정됩니다 SystemOptions["ParallelOptions"]
.
하위 커널에서 이러한 기능을 사용하면 단일 코어 만 사용합니다. 를보고이를 확인할 수 있습니다 ParallelEvaluate@SystemOptions["ParallelOptions"]
. 모든 스레드 수는 서브 커널에서 1로 설정됩니다.
일반적으로 명시 적 병렬화 (예 ParallelTable
:)는 일부 함수의 기본 제공 병렬화만큼 효율적이지 않습니다. 따라서 병목 현상이 이미 병렬로 실행되는 함수 인 경우 추가 병렬화 ParallelTable
또는 관련 함수 를 구현 하면 속도가 느려집니다 (또는 적어도 내가 확인한 모든 경우에서 속도가 느려졌습니다).