2014-11-28 9 views
1

나는 작업을 만들 PPL을 사용하기 시작하고 파견하고 [아마도이 같은 다른 스레드에 :스레드를 만들 때 PPL이 시스템의 부하를 고려하고 있습니까?

Concurrency::task_group tasks; 
auto simpleTask = Concurrency::make_task(&simpleFunction); 
tasks.run(simpleTask); 

나는 모든 두 번째 작업을 생성하는 작은 응용 프로그램으로 실험. 작업은 5 초 동안 과도한 계산을 수행 한 다음 중지합니다.

PPL이 내 컴퓨터에서 만드는 스레드의 수와 컴퓨터의 부하가 스레드 수 또는 스레드에 할당 된 작업에 영향을 주는지 여부를 알고 싶었습니다. 내 12 코어 컴퓨터에서 하나 이상의 응용 프로그램 인스턴스를 실행할 때 다음과 같이 알 수 있습니다.

  • 하나의 응용 프로그램을 실행하면 6 개의 스레드가 생성됩니다. 총 CPU 사용량은 50 %입니다.
  • 2 개의 응용 프로그램을 실행할 때 두 스레드 모두 6 개의 스레드를 생성합니다. 총 CPU 사용량은 100 %이지만 내 컴퓨터는 반응이 좋지 않습니다.
  • 3 개의 응용 프로그램을 실행할 때 모두 6 개의 스레드 (총 18 개의 스레드)를 생성합니다. 총 CPU 사용량은 100 %입니다.
  • 4 개의 응용 프로그램을 실행할 때 이미 총 24 개의 스레드가 있습니다.

프로세스 탐색기와 4 개의 응용 프로그램으로 실행중인 응용 프로그램을 조사한 결과 모든 스레드에 가능한 많은 CPU를 사용하려고하는 6 개의 (심지어 12 개) 스레드가 있음을 분명히 볼 수 있습니다.

Concurrency::SchedulerPolicy policy(1, Concurrency::MaxConcurrency,2); 
Concurrency::Scheduler::SetDefaultSchedulerPolicy(policy); 

을이 사용하면 정적으로 (이 경우 2) 스레드의 수를 제한 :

PPL은이 같은 기본 스케줄러를 구성하여 스레드의 수를 제한 할 수 있습니다. 24 개의 코어를 가진 서버에서 10 명의 동시 사용자가 있으므로 (모든 응용 프로그램을 2 개의 스레드로 제한 할 수 있음), 10 명의 사용자 중 하나가 늦게까지 작업하는 경우에도 여전히 2 개의 스레드 만 사용한다는 것을 알고 있다면 편리 할 수 ​​있습니다. 나머지 기계는 공회전 상태입니다.

내 질문 : PPL을 구성하여 동적으로 만들 스레드 수를 동적으로 결정할 수 있습니까 (또는 활성 상태를 유지하거나 활성 상태로 유지할 수 있습니까?)? 또는 PPL은 이미 기본적으로이 작업을 수행하고 있으며 관측치가 정확하지 않습니다.

EDIT : 내 테스트 응용 프로그램의 인스턴스가 더 많이 시작되었지만 컴퓨터가 응답 성이 뛰어 났지만 (원래 질문에서 잘못되었습니다) 응용 프로그램이 동시 동작 수를 줄이는 것을 볼 수 없습니다.

답변

2

귀하의 질문에 대한 짧은 대답은 "아니오"입니다. 기본 PPL 스케줄러 및 자원 관리자는 프로세스 로컬 정보를 사용하여 스레드 작성/제거시기를 결정합니다. the Patterns and Practices article on MSDN에 명시된 바와 같이 :

자원 관리자는 하나의 프로세스에서 작동하는 싱글 톤입니다. 은 여러 운영 체제 프로세스에서 프로세서 리소스를 조정하지 않습니다. 응용 프로그램에서 여러 개의 동시 프로세스 ( )를 사용하는 경우 최적의 효율성을 위해 각 프로세스의 동시성 수준을 줄여야 할 수도 있습니다.당신이 복잡성을 받아 들일 경우

, 당신은 당신이 원하는 것을 달성하기 위해 (예를 들어 using the PDH functions) 간단한 시스템 수준의 성능 측정을 위해 사용자 정의 스케줄러/자원 관리자를 구현 할 수 있습니다.

+0

감사합니다. 내가 원했던 대답이 아니었지만 여전히 도움이되었습니다. – Patrick