Visual Studio 2010을활용한 C++ 병렬 프로그래밍마이에트 엔터테인먼트 Server Programmer최흥배Microsoft Visual C++ MVPTwitter : @jacking75
목차1. Multi-Core 시대2. 어려운 병렬 프로그래밍3. 진화4. Concurrency Runtime5. 병렬 패턴 라이브러리 ( PPL )
Multi-Core 시대
Multi-Core 컴퓨터는 이미 일반화
throughput 컴퓨팅 시대싱글CPU의 스피드 향상의 한계에 도달.
 멀티 코어 CPU로 방향을 바꿈.
throughput가 최대 중요 요소가 됨.
 Intel, AMD의 CPU 아키텍처는 Multi-Core를 넘어서 heterogeneous(헤테로지니아스)로 가고 있음.
AMD - Bulldozer 아키텍처 2 코어를 융합한 클러스터.
 「Bulldozer Module」이라고 부른다.
 2개의 스레드를 병렬로 실행할 수 있는 모듈이 Bulldozer의 기본 단위.  기본은 하나가 아니고 두 개다 !!!
 4 코어의 Bulldozer CPU라면 두 개의 Bulldozer Module을 탑재.
Hyper-Threading이 아니다 !!!Hyper-Threading과의 차이 Intel의 Hyper-Threading에서는 CPU 전체의 자원을 명령 단위로 2개의 스레드에서 공유한다.
Bulldozer에서는 CPU의 자원 중 정수 연산 파이프는 2개의 스레드가 각각 전용 파이프를 가진다.
 그러나 명령 디코더나 부동 소수점 연산 유닛 등은 2개의 스레드에서 공유한다.
 정수 연산에서는 스레드간의 경합이 없기 때문에  throughput가 높다,
Intel - Larrabee아키텍처 현재 Intel은 「Larrabee(라라비)」를 그래픽스 제품으로서 투입하는 것을 단념.
 그러나Intel이 CPU에 통합하기 위한 데이터 병렬 중시형 프로세서 코어의 아키텍처를 긴급하게 필요로 하고 있는 점은 변화지 않음.
Larrabee의 목적은 어떻게 하면 유연하고 고효율이면서 프로그램 하기 쉬운 아키텍처로 할 수 있을지를 추구하는 것.
 Intel의 간부들은 Larrabee와 같은 범용 데이터 병렬 코어를 CPU로 통합하는 것을 전망. 효율성으로 말하면 대형 슈퍼 스칼라 코어와 소형의 데이터 병렬 특화형 코어의 편성의 헤테로지니아스(이종 혼합) 구성이 바람직하다.
 왜냐하면 지금부터 퍼포먼스를 늘리고 싶은 것은 데이터 병렬로 부동 소수점 연산 중심의 작업 부담량이기 때문.
 Amdahl의 법칙은 여전히 살아 있기 때문에 Intel은 대형 슈퍼 스칼라 코어를 버리고 가는 것도 할 수 없다. 필연적으로 헤테로지니아스가 된다.
어려운 병렬 프로그래밍
병렬 프로그래밍? Multi-Core? 그거 먹는 건가요? 우걱우걱
race condition, dead lock
void SetReUseSocket(){  ………  if( flase == m_bUsed ) {       LOG(“SetReUseSocket() | Failed”);      return;  }  LOG(“SetReUseSocket()”);m_bUsed = true;  ………}
진화
2002년2010년
OS – 2001년과 2009년Windows 7Windows XP
Visual Studio – 2002년과 2010년Visual Studio.NET( 2002)Visual Studio 2010
2008년 10월 Microsoft의 최고 연구 전략 책임자를 맡은 Craig Mundie씨 Win32는 비동기 병렬 컴퓨팅에는 적합하지 않는 것을 인정. - Windows 7 및 Windows Server 2008 R2에서 문제 해결을 위해 첫발을 내딪음.- Windows는 지금이라도 2,3의 코어 머신을 처리할 수 있지만 8, 16 또는 32 이상의 코어 머신을 사용하도록 설계되어 있지 않다.
 Windows를 보다 뛰어난 병렬/비동기프로세싱 플랫폼화 하기 위한 최초의 씨앗은 2009년부터 뿌려지기 시작.UMS - Cooperative SchedulingUserThread4UserThread3UserThread5UserThread6Core 2Core 2Core 1Core 1Thread4Thread5UserThread1Thread3Thread1Thread2Thread6UserThread2KernelThread1KernelThread2KernelThread4KernelThread3KernelThread5KernelThread6Non-running threadsThread Scheduling그림 출처 : PDC 09
UMS - Completion List 대기 중인 스레드의커널 모드에서의 Block이 풀리면
 대응하는 유저 모드 스레드는Completion List에 등록되어
 코어에서 실행 중인 스레드가 종료하는 것을 기다린 후 다시 실행한다.NUMAGroupGroupNUMA NodeNUMA NodeSocketSocketSocketSocketNUMA NodeNUMA NodeSocketSocketSocketSocketCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLP그림 출처 : PDC 09
Concurrency RuntimeToolsNative LibrariesIntel ® TBBParallel Pattern LibraryAsynchronousAgentsLibraryIntel®OpenMPVisual Studio 2010ParallelDebuggerProfiler ConcurrencyAnalysisData StructuresIntel Parallel StudioParallel ComposerTask SchedulerParallel InspectorResource ManagerParallel AmplifierNative Concurrency RuntimeOperating SystemThreadsUMS Threads그림 출처 : PDC 09
Concurrency Runtime(ConcRT)
Parallel Patterns LibraryAsynchronus Agents LibrarySynchronization Data StructuresTask SchedulerResource ManagerOS
Parallel Patterns Library(PPL)작업을 작고 세밀하게 처리할 수 있도록 범용적인 컨테이너와 알고리즘 제공
 Imperative parallelism – parallel_for, parallel_for_each등
 Task parallelisn – task_group, structured_task_groupAsynchronous Agents Library(AAL) Actor 베이스 모델 및 메시지 전달을 통해서 작고 세밀한 data flow와 task pipeniling을 제공
 AAL은 다른 컴포넌트의 데이터를 기다리면서 작업을 처리 할 수 있다.
 AAL은 복수의 엔티티가 서로간에 비동기로 통신을 할 때 사용한다.
class GameLogic : public agent {.....   void run()   {      // Send the request.      ......      send(_target, wstring(L"request"));      // Read the response.int response = receive(_source);   }private:   ISource<int>& _source;ITarget<wstring>& _target;};class GameAI : public agent {.....   void run()   {      // Send the request.      ......      send(_target, wstring(L"request"));      // Read the response.int response = receive(_source);   }private:   ISource<int>& _source;ITarget<wstring>& _target;};
Synchronization Data Structures여러 스레드로부터 공유 데이터 접근을 동기화 할 수 있는 몇 개의 데이터 구조를 제공.
동기 오브젝트는 크리티컬 섹션과 같이 다른 스레드로부터 공유 데이터를 사용할 수 있을 때까지 기다린다.
critical_section, reader_writer_lock, eventTask Scheduler 실행 시에 task의 스케쥴링 및 조정을 한다.
 cooperative 스케쥴링과 work-stealing 알고리즘을 사용하여 최대한 효율이 좋게 리소스를 처리하도록 한다.
 Concurrency Runtime은 기본적인 스케쥴러를 제공하므로 직접 관리할 필요는 없다.
 다만 우리가 만든 애플리케이션에 최적화 시켜 더 높은 성능을 얻고 싶을 때는 스케줄러의 정책을 변경하거나 특별한 task, 특별한 스케줄러와 제휴할 수 있다.Resource Manager Processors나 메모리 등의 컴퓨팅 리소스를 관리하는 것이 목적.
 실행 시에 작업 부하에 변경이 일어나면 가장 효율이 좋게 처리할 수 있도록 리소스를 할당.
 컴퓨팅 리소스를 추상화하여 Task Scheduler와 주로 대화.
 더 높은 성능을 얻기 위해서 Resource Manager를 세밀하게 조정할 수 있다.
 다른 병렬 라이브러리의 병행 런타임과 컴퓨팅 리소스 관리를 통합 할 수 있다.DynamicSchedulingStatic SchedulingCPU0CPU1…CPUNCPU0CPU1…CPUNSmallSmallBigBigBigBigBigBigSmallSmallBigSmallSmallBigSmallSmall
ConcRT의 CooperativeDemo
코어 증가와 Resource Management 4개의 Core를 가진 ConcRT를 사용한 프로세스가 두개 실행 중이라면, 하나의 ConcRT는 Core 0, Core 1에서, 두 번째 ConcRT는 Core 2, Core 3에서 실행ConRT Memory leak?#include "stdafx.h"#include <ppl.h>using namespace Concurrency;int main(){    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );parallel_invoke( [] { }, [] { } );    return 0;}위 코드는 디버그 모드에서 메모리 릭을 경고.
이유는 Task Scheduler와 Resource Manage가 파괴되기 전에 프로그램이 종료 되기 때문.int main(){HANDLE hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );CurrentScheduler::Create( SchedulerPolicy() );CurrentScheduler::RegisterShutdownEvent( hEvent );    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );parallel_invoke( [] {}, [] {} );CurrentScheduler::Detach();WaitForSingleObject( hEvent, INFINITE );CloseHandle( hEvent );    Sleep(500);    return 0;}
병렬 패턴 라이브러리 ( PPL )
PPL의 세 가지 features Task Parallelism
 Parallel algorithms
 Parallel containers and objects 3D 게임을 실행하면…Font 리소스 로딩Texture 리소스 로딩3D 모델링 리소스 로딩 등등…
Task Parallelism실제적인 task의 실행은 task_group에서 한다.unstructured_task_group(task_group) 와 structured_task_group로나누어진다.task_group  : 스레드 세이프structured_task_group  : 스레드 세이프 하지 않음.
Main ThreadMain Threadtask_group1.run( task1)structured_task_group1.run( task1)Thread Atask_group1.run( task2)Thread Btask_group1.run( task3)Thread Astructured_task_group1.run( task2)
초 간단!!!  task 사용 방법ppl.h파일을 포함합니다.#include <ppl.h>Concurrency Runtime의 네임 스페이를 선언합니다.using namespace Concurrency;태스크 그룹을 정의합니다.structured_task_groupstructured_tasks;태스크를 정의합니다.auto structured_task1 = make_task([&] { Plus(arraynum1, true); } );태스크를 태스크 그룹에 추가한 후 실행합니다.  structured_tasks.run( structured_task1 );태스크 그룹에 있는 태스크가 완료될 때까지 기다립니다.structured_tasks.wait();
ConcRT의 TaskDemo
for( i = 0; i < 1000000; ++i ){ ………… …………}
Parallel Algorithms데이터컬렉션을 대상으로 쉽게 병렬 작업을 할 수 있게 해주는 알고리즘들.STL에서 제공하는 알고리즘과 비슷한 모양과 사용법.paeallel_for, parallel_for_each, parallel_invoke가 구현되어 있음.parallel_accumulate, parallel_partial_sum는 다음 버전?
parallel_forfor 문을 병렬화.for 문과 사용 방법이 흡사하여 쉽게 변환.step 값을 지정하는 버전과 지정하지 않는 버전 두 개가 있음(지정하지 않으면 1).index 조사는 ‘<‘만 지원.
초 간단!!! parallel_for사용 법ppl.h파일을 포함합니다.#include <ppl.h>Concurrency Runtime의 네임 스페이를 선언합니다.using namespace Concurrency;parallel_for에서 호출할 함수 정의parallel_for에서 사용할 data set 정의.parallel_for사용.
parallel_for_eachSTL의 for_each알고리즘을 병렬화.for_each와 사용 방법이 같음.
초 간단!!! parallel_for_each사용 법ppl.h파일을 포함합니다.#include <ppl.h>Concurrency Runtime의 네임 스페이를 선언합니다.using namespace Concurrency;parallel_for_each에서 호출할 함수 정의parallel_for_each에서 사용할 data set 정의.parallel_for_each사용.

Visual C++10을 활용한 병렬 프로그래밍

  • 1.
    Visual Studio 2010을활용한C++ 병렬 프로그래밍마이에트 엔터테인먼트 Server Programmer최흥배Microsoft Visual C++ MVPTwitter : @jacking75
  • 2.
    목차1. Multi-Core 시대2.어려운 병렬 프로그래밍3. 진화4. Concurrency Runtime5. 병렬 패턴 라이브러리 ( PPL )
  • 3.
  • 4.
  • 5.
    throughput 컴퓨팅 시대싱글CPU의스피드 향상의 한계에 도달.
  • 6.
    멀티 코어CPU로 방향을 바꿈.
  • 7.
  • 8.
    Intel, AMD의CPU 아키텍처는 Multi-Core를 넘어서 heterogeneous(헤테로지니아스)로 가고 있음.
  • 9.
    AMD - Bulldozer아키텍처 2 코어를 융합한 클러스터.
  • 10.
  • 11.
    2개의 스레드를병렬로 실행할 수 있는 모듈이 Bulldozer의 기본 단위. 기본은 하나가 아니고 두 개다 !!!
  • 12.
    4 코어의Bulldozer CPU라면 두 개의 Bulldozer Module을 탑재.
  • 13.
    Hyper-Threading이 아니다 !!!Hyper-Threading과의차이 Intel의 Hyper-Threading에서는 CPU 전체의 자원을 명령 단위로 2개의 스레드에서 공유한다.
  • 14.
    Bulldozer에서는 CPU의 자원중 정수 연산 파이프는 2개의 스레드가 각각 전용 파이프를 가진다.
  • 15.
    그러나 명령디코더나 부동 소수점 연산 유닛 등은 2개의 스레드에서 공유한다.
  • 16.
    정수 연산에서는스레드간의 경합이 없기 때문에 throughput가 높다,
  • 18.
    Intel - Larrabee아키텍처현재 Intel은 「Larrabee(라라비)」를 그래픽스 제품으로서 투입하는 것을 단념.
  • 19.
    그러나Intel이 CPU에통합하기 위한 데이터 병렬 중시형 프로세서 코어의 아키텍처를 긴급하게 필요로 하고 있는 점은 변화지 않음.
  • 20.
    Larrabee의 목적은 어떻게하면 유연하고 고효율이면서 프로그램 하기 쉬운 아키텍처로 할 수 있을지를 추구하는 것.
  • 21.
    Intel의 간부들은Larrabee와 같은 범용 데이터 병렬 코어를 CPU로 통합하는 것을 전망. 효율성으로 말하면 대형 슈퍼 스칼라 코어와 소형의 데이터 병렬 특화형 코어의 편성의 헤테로지니아스(이종 혼합) 구성이 바람직하다.
  • 22.
    왜냐하면 지금부터퍼포먼스를 늘리고 싶은 것은 데이터 병렬로 부동 소수점 연산 중심의 작업 부담량이기 때문.
  • 23.
    Amdahl의 법칙은여전히 살아 있기 때문에 Intel은 대형 슈퍼 스칼라 코어를 버리고 가는 것도 할 수 없다. 필연적으로 헤테로지니아스가 된다.
  • 24.
  • 25.
    병렬 프로그래밍? Multi-Core?그거 먹는 건가요? 우걱우걱
  • 26.
  • 27.
    void SetReUseSocket(){ ……… if( flase == m_bUsed ) { LOG(“SetReUseSocket() | Failed”); return; } LOG(“SetReUseSocket()”);m_bUsed = true; ………}
  • 29.
  • 30.
  • 31.
    OS – 2001년과2009년Windows 7Windows XP
  • 32.
    Visual Studio –2002년과 2010년Visual Studio.NET( 2002)Visual Studio 2010
  • 33.
    2008년 10월 Microsoft의최고 연구 전략 책임자를 맡은 Craig Mundie씨 Win32는 비동기 병렬 컴퓨팅에는 적합하지 않는 것을 인정. - Windows 7 및 Windows Server 2008 R2에서 문제 해결을 위해 첫발을 내딪음.- Windows는 지금이라도 2,3의 코어 머신을 처리할 수 있지만 8, 16 또는 32 이상의 코어 머신을 사용하도록 설계되어 있지 않다.
  • 34.
    Windows를 보다뛰어난 병렬/비동기프로세싱 플랫폼화 하기 위한 최초의 씨앗은 2009년부터 뿌려지기 시작.UMS - Cooperative SchedulingUserThread4UserThread3UserThread5UserThread6Core 2Core 2Core 1Core 1Thread4Thread5UserThread1Thread3Thread1Thread2Thread6UserThread2KernelThread1KernelThread2KernelThread4KernelThread3KernelThread5KernelThread6Non-running threadsThread Scheduling그림 출처 : PDC 09
  • 35.
    UMS - CompletionList 대기 중인 스레드의커널 모드에서의 Block이 풀리면
  • 36.
    대응하는 유저모드 스레드는Completion List에 등록되어
  • 37.
    코어에서 실행중인 스레드가 종료하는 것을 기다린 후 다시 실행한다.NUMAGroupGroupNUMA NodeNUMA NodeSocketSocketSocketSocketNUMA NodeNUMA NodeSocketSocketSocketSocketCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreCoreLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLPLP그림 출처 : PDC 09
  • 38.
    Concurrency RuntimeToolsNative LibrariesIntel® TBBParallel Pattern LibraryAsynchronousAgentsLibraryIntel®OpenMPVisual Studio 2010ParallelDebuggerProfiler ConcurrencyAnalysisData StructuresIntel Parallel StudioParallel ComposerTask SchedulerParallel InspectorResource ManagerParallel AmplifierNative Concurrency RuntimeOperating SystemThreadsUMS Threads그림 출처 : PDC 09
  • 39.
  • 40.
    Parallel Patterns LibraryAsynchronusAgents LibrarySynchronization Data StructuresTask SchedulerResource ManagerOS
  • 41.
    Parallel Patterns Library(PPL)작업을작고 세밀하게 처리할 수 있도록 범용적인 컨테이너와 알고리즘 제공
  • 42.
    Imperative parallelism– parallel_for, parallel_for_each등
  • 43.
    Task parallelisn– task_group, structured_task_groupAsynchronous Agents Library(AAL) Actor 베이스 모델 및 메시지 전달을 통해서 작고 세밀한 data flow와 task pipeniling을 제공
  • 44.
    AAL은 다른컴포넌트의 데이터를 기다리면서 작업을 처리 할 수 있다.
  • 45.
    AAL은 복수의엔티티가 서로간에 비동기로 통신을 할 때 사용한다.
  • 46.
    class GameLogic :public agent {..... void run() { // Send the request. ...... send(_target, wstring(L"request")); // Read the response.int response = receive(_source); }private: ISource<int>& _source;ITarget<wstring>& _target;};class GameAI : public agent {..... void run() { // Send the request. ...... send(_target, wstring(L"request")); // Read the response.int response = receive(_source); }private: ISource<int>& _source;ITarget<wstring>& _target;};
  • 47.
    Synchronization Data Structures여러스레드로부터 공유 데이터 접근을 동기화 할 수 있는 몇 개의 데이터 구조를 제공.
  • 48.
    동기 오브젝트는 크리티컬섹션과 같이 다른 스레드로부터 공유 데이터를 사용할 수 있을 때까지 기다린다.
  • 49.
    critical_section, reader_writer_lock, eventTaskScheduler 실행 시에 task의 스케쥴링 및 조정을 한다.
  • 50.
    cooperative 스케쥴링과work-stealing 알고리즘을 사용하여 최대한 효율이 좋게 리소스를 처리하도록 한다.
  • 51.
    Concurrency Runtime은기본적인 스케쥴러를 제공하므로 직접 관리할 필요는 없다.
  • 52.
    다만 우리가만든 애플리케이션에 최적화 시켜 더 높은 성능을 얻고 싶을 때는 스케줄러의 정책을 변경하거나 특별한 task, 특별한 스케줄러와 제휴할 수 있다.Resource Manager Processors나 메모리 등의 컴퓨팅 리소스를 관리하는 것이 목적.
  • 53.
    실행 시에작업 부하에 변경이 일어나면 가장 효율이 좋게 처리할 수 있도록 리소스를 할당.
  • 54.
    컴퓨팅 리소스를추상화하여 Task Scheduler와 주로 대화.
  • 55.
    더 높은성능을 얻기 위해서 Resource Manager를 세밀하게 조정할 수 있다.
  • 56.
    다른 병렬라이브러리의 병행 런타임과 컴퓨팅 리소스 관리를 통합 할 수 있다.DynamicSchedulingStatic SchedulingCPU0CPU1…CPUNCPU0CPU1…CPUNSmallSmallBigBigBigBigBigBigSmallSmallBigSmallSmallBigSmallSmall
  • 57.
  • 58.
    코어 증가와 ResourceManagement 4개의 Core를 가진 ConcRT를 사용한 프로세스가 두개 실행 중이라면, 하나의 ConcRT는 Core 0, Core 1에서, 두 번째 ConcRT는 Core 2, Core 3에서 실행ConRT Memory leak?#include "stdafx.h"#include <ppl.h>using namespace Concurrency;int main(){ _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );parallel_invoke( [] { }, [] { } ); return 0;}위 코드는 디버그 모드에서 메모리 릭을 경고.
  • 59.
    이유는 Task Scheduler와Resource Manage가 파괴되기 전에 프로그램이 종료 되기 때문.int main(){HANDLE hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );CurrentScheduler::Create( SchedulerPolicy() );CurrentScheduler::RegisterShutdownEvent( hEvent ); _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );parallel_invoke( [] {}, [] {} );CurrentScheduler::Detach();WaitForSingleObject( hEvent, INFINITE );CloseHandle( hEvent ); Sleep(500); return 0;}
  • 60.
  • 61.
    PPL의 세 가지features Task Parallelism
  • 62.
  • 63.
    Parallel containersand objects 3D 게임을 실행하면…Font 리소스 로딩Texture 리소스 로딩3D 모델링 리소스 로딩 등등…
  • 64.
    Task Parallelism실제적인 task의실행은 task_group에서 한다.unstructured_task_group(task_group) 와 structured_task_group로나누어진다.task_group : 스레드 세이프structured_task_group : 스레드 세이프 하지 않음.
  • 65.
    Main ThreadMain Threadtask_group1.run(task1)structured_task_group1.run( task1)Thread Atask_group1.run( task2)Thread Btask_group1.run( task3)Thread Astructured_task_group1.run( task2)
  • 66.
    초 간단!!! task 사용 방법ppl.h파일을 포함합니다.#include <ppl.h>Concurrency Runtime의 네임 스페이를 선언합니다.using namespace Concurrency;태스크 그룹을 정의합니다.structured_task_groupstructured_tasks;태스크를 정의합니다.auto structured_task1 = make_task([&] { Plus(arraynum1, true); } );태스크를 태스크 그룹에 추가한 후 실행합니다.  structured_tasks.run( structured_task1 );태스크 그룹에 있는 태스크가 완료될 때까지 기다립니다.structured_tasks.wait();
  • 67.
  • 69.
    for( i =0; i < 1000000; ++i ){ ………… …………}
  • 70.
    Parallel Algorithms데이터컬렉션을 대상으로쉽게 병렬 작업을 할 수 있게 해주는 알고리즘들.STL에서 제공하는 알고리즘과 비슷한 모양과 사용법.paeallel_for, parallel_for_each, parallel_invoke가 구현되어 있음.parallel_accumulate, parallel_partial_sum는 다음 버전?
  • 71.
    parallel_forfor 문을 병렬화.for문과 사용 방법이 흡사하여 쉽게 변환.step 값을 지정하는 버전과 지정하지 않는 버전 두 개가 있음(지정하지 않으면 1).index 조사는 ‘<‘만 지원.
  • 72.
    초 간단!!! parallel_for사용법ppl.h파일을 포함합니다.#include <ppl.h>Concurrency Runtime의 네임 스페이를 선언합니다.using namespace Concurrency;parallel_for에서 호출할 함수 정의parallel_for에서 사용할 data set 정의.parallel_for사용.
  • 73.
  • 74.
    초 간단!!! parallel_for_each사용법ppl.h파일을 포함합니다.#include <ppl.h>Concurrency Runtime의 네임 스페이를 선언합니다.using namespace Concurrency;parallel_for_each에서 호출할 함수 정의parallel_for_each에서 사용할 data set 정의.parallel_for_each사용.
  • 77.
    parallel_invoke병렬로 일련의 태스크실행.동시 실행할 복수의 독립된 태스크를 실행할 때 좋음.task_group과 비슷하나 사용방법은 더 쉬움그러나 최대 10개의 태스크만 병렬 작업이 가능하다.
  • 78.
    초 간단!!! parallel_invoke사용법ppl.h파일을 포함합니다.#include <ppl.h>Concurrency Runtime의 네임 스페이를 선언합니다.using namespace Concurrency;태스크 정의parallel_invoke사용.
  • 80.
    parallel objects - combinable스레드세이프한 오브젝트.계산 실행 후 최종 결과에 그 계산 결과를 통합하는 재 사용 가능한 로컬 스트리지 제공.복수의 스레드 또는 태스크 간에 공유 리소스가 있는 경우 편리.lock-free thread-local sub-computations during parallel algorithmscombinable 클래스에 사용할 데이터는 기본 생성자와 복사 생성자를 가지고 있어야 한다.Win32 API의 thread local storage와 비슷.combine, combinable_each제공
  • 83.
    concurrent containers병렬 환경에서스레드 세이프하게 데이터를 저장.concurrent_queue, concurrent_vector,.concurrent_hash_map은다음 버전?
  • 84.
    concurrent_vector 병렬 프로그래밍에접합한 STL vector 타입의컨테이너.
  • 85.
    전체적인 인터페이스는vector와 비슷하나 제한이 있슴.
  • 86.
    기존 요소의값을 변경할 때는 스레드 세이프하지 않음. 기존 요소의 값을 변경할 때는 동기화 객체를 사용하여 lock을 걸어야 합니다.
  • 87.
    concurrent_vector사용 방법- concurrent_vector를사용하기 위해서 먼저 헤더 파일을 포함해야 합니다.- concurrent_vector의 헤더 파일은 “concurrent_vector.h” 입니다.- STL의 vector 사용 방법과 거의 같음.
  • 88.
    concurrent_deque 병렬 프로그래밍에접합한 STL deque타입의컨테이너.
  • 89.
  • 90.
    반복자를 지원하지만스레드 세이프 하지 않다.
  • 91.
    front와 pop함수를 지원하지 않음. 대신에 try_pop함수를 대신해서 사용.
  • 92.
    back 함수를지원하지 않는다. 그러므로 마지막 요소를 참조하는 것은 불가능하다.
  • 93.
    size 메소드대신 unsafe_size함수를 지원한다. unsafe_size는 이름 그대로 스레드 세이프 하지 않다.
  • 94.
    사용 방법 -“concurrent_queue.h” 파일을 include 한다. - 사용 방법은 STL의 deque와 비슷.스레드 세이프한 concurrent_queue의 함수- concurrent_queue에 enqueue또는 dequeue하는 모든 조작에 대해서는 스레드 세이프합니다. empty
  • 95.
  • 96.
  • 97.
    try_pop- empty는 스레드세이프하지만 empty 호출 후 반환되기 전에 다른 스레드에 의해서 queue가 작아지던가 커지는 경우 이 동작들이 끝난 후에 empty의 결과가 반환됩니다.스레드 세이프 하지 않은 concurrent_queue의 함수 clear
  • 98.
  • 99.
  • 100.
    unsafe_sizeIntel의 TBB를 배운후 ConcRt를 보면……ConcRt를 배운 후 TBB를 보면……
  • 102.
  • 103.
    AMD가 차기 아키텍쳐「Bulldozer」와「Bobcat」의 개요를 공표원문 : http://pc.watch.impress.co.jp/docs/column/kaigai/20091112_328392.html번역 :http://jacking.tistory.com/487http://jacking.tistory.com/488http://jacking.tistory.com/4892011년에 등장하는 AMD의 8코어 데스크탑 CPU 「Zambezi」원문http://pc.watch.impress.co.jp/docs/column/kaigai/20091126_331235.html번역http://jacking.tistory.com/514http://jacking.tistory.com/515http://jacking.tistory.com/516Core i5/i7원문http://www.atmarkit.co.jp/fwin2k/words/011corei5/corei5.html번역http://jacking.tistory.com/510http://jacking.tistory.com/511
  • 104.
    계획이 바뀐 Larrabee무엇이문제였는가?http://jacking.tistory.com/517http://jacking.tistory.com/518마이크로소프트 Windows 7에서도 병렬처리 향상을 목표로 http://jacking.tistory.com/355[PDC09] Developing Applications for Scale-Up Servers Running Windows Server 2008 R2http://microsoftpdc.com/Sessions/SVR18[PDC09] Lighting up Windows Server 2008 R2 Using the ConcRT on UMShttp://microsoftpdc.com/Sessions/SVR10양보할 줄 아는 Concurrency Runtime의 eventhttp://vsts2010.tistory.com/109Cross Process Resource Management - do we need it now?http://blogs.msdn.com/nativeconcurrency/archive/2010/04/07/cross-process-resource-management-do-we-need-it-now.aspx
  • 105.
    Concurrency::task_group leaks memoryhttp://social.msdn.microsoft.com/Forums/en/parallelcppnative/thread/15799a79-cca0-4c51-85e3-64ea1e26981dMSDN– Concurrency Runtimehttp://msdn.microsoft.com/en-us/library/dd504870(VS.100).aspxVSTS 2010 스터디블로그http://vsts2010.netParallel Programming in Native Codehttp://blogs.msdn.com/nativeconcurrency/default.aspx본인 블로그http://jacking.tistory.com/