Parallel Patterns Library(PPL) - Task

VC++ 10 Concurrency Runtime 2009. 8. 18. 00:27 Posted by 알 수 없는 사용자
이번 글은 길이가 좀 깁니다. 내용은 복잡한 것이 아니니 길다고 중간에 포기하지 마시고 쭉 읽어주세요^^


이전 회에서는 PPL에 대한 개념을 간단하게 설명했고, 이번에는 PPL의 세가지 feature 중 태스크(Task)에 대해서 설명하려고 합니다. 태스크에 대한 설명은 이미 이전에 정재원님께서 블로그를 통해서 설명한 적이 있습니다. 정재원님의 글은 태스크 사용 예제 코드를 중심으로 설명한 것으로 저는 그 글에서 빠진 부분과 기초적인 부분을 좀 더 설명하려고 합니다.

 

태스크라는 것은 작업 단위라고 생각하면 좋을 것 같습니다. 작업이라는 것은 여러 가지가 될 수 있습니다. 피보나치 수 계산, 배열에 있는 숫자 더하기, 그림 파일 크기 변경 등 작고 큰 작업이 있습니다. 보통 크기가 큰 작업은 이것을 작은 작업 단위로 나누어 병렬 처리를 하기도 합니다.

 

PPL의 태스크는 작업을 그룹 단위로 묶어서 병렬로 처리하고 대기 및 취소를 할 수 있습니다.

 

 


태스크 핸들

태스크 핸들은 각각의 태스크 항목을 가리키며 PPL에서는 task_handle 클래스를 사용합니다. 이 클래스는 람다 함수 또는 함수 오브젝트 등을 태스크를 실행하는 코드로 캡슐화 합니다. 태스크 핸들은 캡슐화 된 태스크 함수의 유효 기간을 관리하기 때문에 중요합니다. 예를들면 태스크 그룹에 태스크 핸들을 넘길 때는 태스크 그룹이 완료 될때까지 유효해야합니다.


보통 태스크 관련 예제 코드를 보면 task_handle 대신 C++0x의 auto를 사용하는 편이 코드가 더 간결해지므로 task_handle 보다는 auto를 사용하고 있습니다.


 

 

unstructured structured Task Groups

태스크 그룹은 unstructured structured 두 개로 나누어집니다.

두개의 태스크 그룹의 차이는 스레드 세이프하냐 안하느냐의 차이입니다.

unstructured는 스레드 세이프 하고 structured는 스레드 세이프 하지 않습니다.


태스크 관련 예제에 자주 나오는 task_group 클래스는 unstructured 태스크 그룹이고, structured_task_group 클래스는 structured 태스크 그룹을 뜻합니다.

 

unstructured 태스크 그룹은 structured 태스크 그룹보다 유연합니다. 스레드 세이프 하며 작업 중 taks_group::wait를 호출하여 대기한 후 태스크를 추가한 후 실행할 수 있습니다. 그렇지만 성능면에서 structured 태스크 그룹이 스레드 세이프 하지 않으므로 unstructured 태스크 그룹보다 훨씬 더 좋으므로 적절하게 선택해서 사용해야 합니다.

 

structured 작업 그룹은 스레드 세이프 하지 않기 때문에 Concurrency Runtime에서는 몇가지 제한이 있습니다.

- structured 작업 그룹 안에 다른 structured 작업 그룹이 있을 경우 내부의 작업 그룹은 외부의 작업 그룹보다 먼저 완료해야 한다.

- structured_task_group::wait 멤버를 호출한 후에는 다른 작업을 추가한 후 실행할 수 없다.


 

 

초간단!!! 6단계로 끝내는 태스크 사용 방법


1. ppl.h 파일을 포함합니다.

   #include <ppl.h>

 

2. Concurrency Runtime의 네임 스페이를 선언합니다.

   using namespace Concurrency;

 

3. 태스크 그룹을 정의합니다.

  structured_task_group structured_tasks;

 

4. 태스크를 정의합니다.

  auto structured_task1 = make_task([&] { Plus(arraynum1, true); } );

 

5. 태스크를 태스크 그룹에 추가한 후 실행합니다.

  structured_tasks.run( structured_task1 );

 

6. 태스크 그룹에 있는 태스크가 완료될 때까지 기다립니다.

  structured_tasks.wait();

 

위의 순서대로 하면 태스크를 사용할 수 있습니다. 태스크 사용 참 쉽죠잉~ ^^.

참고로 여러 개의 태스크를 그룹에 추가하고 싶다면 6번 이전에 4번과 5번을 추가할 개수만큼 반복하면 됩니다.


* 4번의 Plus(arraynum1, true);는 하나의 태스크에서 실행할 함수입니다.

 


PPL의 태스크를 사용하면 병렬 프로그래밍을 간단한 6단계만으로 끝낼 수 있습니다. 만약 현재의 Win32 API로 이것을 구현하기 위해서는 학습에 많은 시간을 보낸 후 저수준의 API를 사용하여 구현해야 되기 때문에 구현 시간과 안정성에서 PPL의 태스크보다 손해를 봅니다.




태스크 그룹과 스레드 세이프

unstructured structured 태스크 그룹의 차이가 스레드 세이프 유무의 차이라고 했는데 이 말은

unstructured 태스크 그룹은 복수의 스레드에서 호출 및 대기를 할 수 있지만 structured 태스크 그룹은 그것을 생성한 스레드에서만 호출 및 대기를 할 수 있습니다.


예를 들면 스레드 A, 스레드 B가 있는 경우 스레드 A와 B에서 태스크를 실행 후 대기를 한다면 unstructured 태스크 그룹을 사용해야하고, 오직 하나의 스레드에서만(스레드 A에서만) 태스크를 실행 후 대기를 한다면 structured 태스크 그룹을 사용합니다.


스레드 세이프는 스레드 세이프 하지 않는 것보다 오버헤드가 발생합니다. 즉 스레드 세이프 버전은 스레드 세이프 하지 않은 버전보다 성능이 떨어진다는 것이죠.

그러니 태스크 그룹을 어떤 방식으로 사용할지 파악 후 스레드 세이프 필요성에 따라서 unstructured 태스크 그룹과 structured 태스크 그룹 중 상황에 알맞은 것을 선택해서 사용해야 합니다.




ps : 제가 8월 14일 글을 공개할 때 태스크 그룹의 스레드 세이프 특성을 잘 못 이해하여 잘못된 내용을 전달하였습니다. 그래서 오늘 글을 다시 수정하였습니다. ;;;;;;

다음부터는 틀린 글을 올리지 않도록 조심하겠습니다. ^^;;;;;;

[JumpToDX11-1] 사라진 Direct3D 오브젝트를 찾아서...

DirectX 11 2009. 8. 17. 14:00 Posted by 알 수 없는 사용자

< 인사 및 소개 >

안녕하세요.
저는 이번에 vsts2010 에 참여하게 된 조진현 이라고 합니다.

어떤 주제에 대해서 글을 쓰다는 것은 무척 어려운 일입니다.

그렇기 때문에, 이 스터디 참가를 굉장히 망설이기도 했습니다.
많은 분들과 함께 열정을 가지고 참가를 결심했고, 드디어 처음으로 글을 남기게 되었습니다.
제가 가장 우려하는 것은 잘못된 지식을 전달하는 것입니다.
그래서 조심스러운 마음으로 글을 작성할 것입니다.
잘못된 부분이나 미흡한 부분이 있으면, 바로 지적해주시면 감사하겠습니다.

제가 언급할 큰 주제는 DirectX 11 과 관련이 있습니다.
그 중에서도 멀티 코어를 활용한 DirectX 사용에 초점을 두고 글을 전개할 생각입니다.
글의 주요 대상은 DirectX9 를 사용하시다가 DirectX11 을 사용하고자 하시는 분들입니다.

일단 방대한 변화에 대해서 모두 나열하기는 힘듭니다.

그래서 간단히 제가 코딩을 하면서 필요했던 API 위주로 살펴보면서 변화를 언급하고자 합니다.
그런데 하나 문제가 있습니다.
현재 DirectX 11 은 하드웨어 가속이 지원되지 않습니다.
오직 REF 모드로만 작동을 합니다.
아마도 아직 정식으로 widnows 7 이 출시가 이루어지지 않아서 그런 듯 합니다.
이점, 꼭 주의하시기 바랍니다.
괜히 DirectX 11 예제 실행했다가, 실행 성능이 떨어진다고 컴퓨터를 부수는 행위는 자제해 주세요.^^


< 사라진 Direct3D 오브젝트를 찾아서... >

우리가 가장 먼저 접하게 되는 DirectX 의 API 는 CreateDevice() 일 것입니다.
사실 이전 버전까지는 CreateDevice() 에 대해서 별도로 언급할 내용이 없었을 것이지만,
늘(?) 그렇듯이 DirectX 의 변화를 설명해주는 API 가 바로 CreateDevice() 입니다.
일단 CreateDevice() 를 위한 관련 변수들부터 봐야겠죠?
 



잠깐!!
가장 먼저 헤더 파일들을 살펴보는게 순서이죠.

헤더는 다음과 같이 변경되었습니다.
굳이 헤더의 용도에 대해서 일일이 나열하지는 않았습니다.

// Direct3D11 includes
#include <dxgi.h>
#include <d3d11.h>
#include <d3dCompiler.h>
#include <d3dx11.h>
#include <dxerr.h>

 

라이브러리 링크는 아래의 것들을 해주시면 됩니다.

#pragma comment( lib, "dxguid.lib" )
#pragma comment( lib, "d3dcompiler.lib" )
#pragma comment( lib, "dxerr.lib" )
#pragma comment( lib, "dxgi.lib" )
#pragma comment( lib, "d3d11.lib" )
#pragma comment( lib, "d3dx11.lib" )




변수들을 나열해 보겠습니다.




 생소한 부분이 눈에 보이시나요?
 'ID3D11DeviceContext' 라는 것이 새롭게 등장했습니다. ( 다음 번에 언급할 것입니다. )
 그리고 Direct3D 인터페이스가 사라진 것을 찾으셨습니까?




위의 그림은 DirectX 9 의 아키텍쳐입니다.
우리가 작성하는 프로그램은 오직 Direct3D 나 GDI 를 통해서 저수준의 하드웨어와 통신을 할 수 있었습니다.

그런데 현재의 DirectX 아키텍쳐는 아래와 같습니다.



 여기서 또 하나 생소한 것이 등장했습니다.
바로 DXGI ( DirectX Graphics Infrastructure ) 입니다.
"DirectX9 에서 사라진 'Direct3D 오브젝트'를 'DXGI' 가 대체하는게 아닐까?" 라는 의문이 들었다면,
박수를 보내드리고 싶습니다.( 브라보~~ )


네, 맞습니다.
'DXGI' 라는 것이 바로 사라진 'Direct3D 오브젝트' 입니다.
'Direct3D 오브젝트' 의 역활에 대해서 혹시 기억하십니까?
하드웨어와 연결된 디바이스들을 나열하고, 모니터로 출력되는 결과들을 관리해주기도 했었습니다.
우리가 관리하기 힘든 저 수준의 작업들을 바로 이 'Direct3D 오브젝트'가 했었습니다.
그런데 이제는 이것을 'DXGI' 가 해주고 있습니다.
( IDXGISwapChain 보이시나요? 이것도 다음 회에 언급하겠습니다. )
 

아키텍쳐 구조를 보시면 아시겠지만, DirectX9 까지는 일반 애플리케이션에서 DirectX API 를 통하지 않고는
DirectX 를 사용할 수 없었습니다.
그런데 최근에는 일반 애플리케이션은 모두 DXGI 를 통해서 DirectX 를 사용하고 있습니다.
( 저만 놀라운 것은 아니겠죠? +_+ )
마이크로소프트에서도 강조하고 있는 사실 중에 하나가 바로 DirectX 는 더 이상 게임만을 위한 것이 아니라는 것입니다.
이제 사라진 줄 알았던 'Direct3D 오브젝트' 가 DXGI 라는 사실을 알았습니다.
앞으로 저수준의 작업이 필요하면 DXGI 를 직접 제어하거나 DirectX API 를 이용하셔도 됩니다.


< 다음 회에는... >

다음 번에는 실제로 DirectX API 를 이용한 초기화 작업에 대해서 다루고자 합니다.
즉, 우리가 앞서 선언했던 변수들에 대한 이야기를 하겠습니다.

'DirectX 11' 카테고리의 다른 글

[DX11_#2]D3D Buffer( 2 / 2 )  (0) 2009.10.13
[DX11_#1]D3D Buffer( 1 / 2 )  (0) 2009.09.22
[JumpToDX11-4] ID3D11View  (0) 2009.09.07
[JumpToDX11-3] Feature Level  (0) 2009.08.31
[JumpToDX11-2]DeviceContext...넌 누구냣!!  (1) 2009.08.24

구름 속의 미래 : Windows® Azure™ Platform [1]

Cloud 2009. 8. 13. 02:12 Posted by 알 수 없는 사용자


    반갑습니다
    ! Q3 에서 활동하게 Ted 라고 합니다. ^^

    저는 Q3 에서 MS 클라우드 플랫폼 Azure 대해 이야기 하려고 합니다.

     

    시작하면서...

     

     

    단순히 서버에 저장된 정보를 액세스 하는 것이 아니라 ‘구름(Cloud)’의 컴퓨팅 능력을 얻어서 사용 하는 클라우드 컴퓨팅이 글로벌 기업들의 적극적인 투자와 구축에 따라 점차 대중화 되어 가고 있습니다.

     

    상대적으로 MS 늦게 클라우드(Cloud) 시장에 뛰어 들었습니다.
    클라우드 컴퓨팅 플랫폼 Azure 발표하면서 MS 최고 아키텍트 레이 오지는 인터뷰 중에 "Azure 새로운 컴퓨터" 라고 말했었죠.

     

    구름.. 구름에서의 컴퓨팅.. 새로운 컴퓨터..

    새로운 기술과 개념들이 지적 호기심과 즐거움을 주고 있습니다.

     

    글에선 간단하게 클라우드(Cloud) 컴퓨팅의 개념을 알아보고 Azure Platform 어떻게 구성되어 있는지 살펴보겠습니다.

     

     

    클라우드 컴퓨팅? 플랫폼?

     

    클라우드(Cloud) 그대로 구름입니다. ^^

    IT 분야에서 최근 유행하는 클라우드(Cloud) 의미는 복수의 데이터센터(IDC) 가상화 기술을 통해 소프트웨어, 하드웨어, 네트워크, 컴퓨팅 파워 등의 전산 자산을 통합해 놓은 것을 의미합니다.

     

    그렇다면 클라우드 컴퓨팅이란 무엇일까요?

    사용자가 PC, 휴대폰, PDA 등 컴퓨팅이 가능한 단말기를 통해 구름(Cloud)에 접속해서 원하는 작업을 하는 것입니다. 크게 가지 작업을 있겠죠.
    언제 어디서나 데이터를 저장하고 프로그램을 실행시킨다.


    뿐만 아니라 인프라를 서비스로 제공받거나(IaaS), 플랫폼을 서비스로 제공(PaaS) 받는 것이 또한 클라우드 컴퓨팅에서 가능합니다.


    클라우드를 제공하는 회사 입장에서 본다면 애플리케이션, 인프라, 플랫폼을 "서비스"의 형태로 일정 금액을 받고 제공해 주는 것입니다. 이 서비스들을 통털어 클라우드 플랫폼이라고 하는 것이죠.


    아래
    그림은 현존 하는 클라우드 플랫폼들이 제공하는 서비스를 분류해 놓는 도식 입니다.

    클라우드 컴퓨팅을 제공하는 글로벌 벤더들은 서비스들 중에 일부 또는 전부를 제공하고 있습니다.

    SaaS, IaaS, PaaS
    없는(?) 말들이 난무 합니다. 관련해서 좋은 있으니 참고하세요!

     

    < 출처 : http://nexr.tistory.com/ >

     

    오늘은 정도로 클라우드에 대한 설명을 마치겠습니다. (앞으로 ~ 계속 됩니다)

    광범위고 추상적인 개념이다 보니 아직은 멀게만 느껴집니다.

    앞으로 Azure 통해 프랙티스를 경험해 보고 실제로 사용하면 많이 가까워 있겠죠? ^^

     

     

    An Overview of The Windows® Azure™ Platform

     

    < 여기서 잠깐! >

    Window Azure Azure Platform 다른 것입니다.

    Window Azure Azure 플랫폼에서 운영체제를 담당하는 부분입니다.! 


    Azure Platform?
     


    Azure Platform 은 클라우드
    운영체제(Windows Azure) 와 클라우드 컴퓨팅을 위한 편의를 제공하는 다양한 서비스들(Live Service, .NET Service..) 을 말합니다.


     

    1. Windows Azure
     클라우드 운영체제입니다. 

    사진 및 동영상 등의 Blob(바이너리 형식의 큰 파일)을 저장하는 스토리지, 실제 연산 및 처리 작업을 수행하는 컴퓨팅, 서비스에 대한 관리의 역할을 제공합니다.
     

    2. 서비스 모듈들 

     Azure Platform 클라우드 컴퓨팅을 이용해 쉽게 개발할 수 있도록 다양한 서비스가 제공됩니다.


     기반 애플리케이션 모듈

    Live Services: Live Mesh 개념의 Social Service 애플리케이션 개발

    SQL Services: 클라우드 서비스용 SQL Server 연동 모듈

    .NET Services: 클라우드 애플리케이션 서비스 개발 프레임웍

     
     전용 애플리케이션 모듈

    Sharepoint Services: 협업 관련 서비스 개발

    Dynamics CRM Services: CRM 관련 서비스 개발


    Windows Azure?

     
    Windows Azure
    는 레드 독(Red Dog)이란 코드명으로 알려진, 마이크로소프트의 클라우드용 운영체제로, 마이크로소프트가 데이터센터에서 운영하게 될 Azure Platform의 핵심 요소입니다. 또한, Windows Azure 는 클라우드용 애플리케이션 개발자들을 위한 개발 환경이기도 하지요.

     > 최신 CTP 다운로드

     > Azure 컬러 설명

     > Windows Azure 블로그


    처음에는 Azure 관련 자료를 찾아보면 수록 이름도 헷갈리고 서비스들의 역할이 아리송 했는데요, Azure MSDN 개발자 사이트 화면에서 바로 "Window Azure 클라우드 운영체제" 라는 말을 보고 "아하" 했답니다.

     

    윈도우나 리눅스 같은 운영체제의 제일 주된 역할은 무엇일까요?

    중요한 역할 중에 하나가 하드웨어 자원을 사용 하는 추상화 방법(HAL) 제공함으로써 소프트웨어 작동 환경을 만들어 주는 것입니다.

     

    같은 맥락에서 보면, 클라우드 운영체제인 Azure 클라우드 자원을 관리하고 추상화 사용 방법을 제공함으로써 컴퓨팅 환경을 제공하는 입니다.

    ( 클라우드 자원이란 위에서 언급한 복수의 데이터센터(IDC) 가상화 기술을 통해 소프트웨어, 하드웨어, 네트워크, 컴퓨팅 파워 등의 전산 자산 입니다. )

     

    아직 모르시겠다구요? FAQ 참고해 주세요!



    마치면서...

    다음 포스팅에서는 Azure 플랫폼을 구성하는 기능들에 대해 상세히 살펴보고 실제 Azure 서비스를 사용해 보겠습니다!