SlideShare a Scribd company logo
DirectX11 이야기

                       조 진현( GOGN )

                 Microsoft DirectX MVP

     VS2010 팀 블로그( www.vsts2010.net )
어떤 3D API를
사용하고 계십니까?
현재 DX 최신 버전은
  DirectX 11.1
9  11
끊어진 흐름을 채우자!
 이 분이 얘기하시기를…
DX 8 -> DX 9
성형 전 -> 성형 후
DX 9 -> DX 10 (11)
완전히 새로운 아키텍쳐
무엇이 ?
어떻게 ?
 왜?
핵심적인 이슈만…
버전이 올라갈 수록
  더 빠르고
  더 안정적이고
  더 풍부하고
  더…
핵심적인 이슈??
시대는 점점…

Multi Thread
Multi CPU
Multi GPU
Multi APU
갑자기 하드웨어가
  변했다니?
지금은 패러다임이
 변했습니다!
우리가 하는 일은

API를 제어하는 것입니다!
핵심적인 이슈란?




멀티 코어 활용   GPU 활용
이제 시작합니다!
우리 OS 의 변화가
  변했어요~
철저히 외면 당한 DirectX 10
왜 DirectX 10 에
주목해야 하는가?
처음부터 새롭게
코딩 했습니다!!!
어떤 기준으로? ( 누구 마음대로? )
Asynchronous!
 Multi-thread!
 Display List!
Vista OS는 DirectX 10
W7 OS는 DirectX 10.1
DirectX 10 은
XP 에서 실행되지 않습니다!
    왜? ( 돈에 환장한 MS라서? )
공학적 마인드
Win32 Application
Win32 Application           Win32 Application




                                                  Direct3D API
                                                                                       Future
  Direct3D API                                                                        Graphics
                                                                                     Components

                                   GDI          User-Mode Driver

 HAL
Device


                                                                       DXGI

         Device Driver Interface ( DDI )



                                                                 Kernel-mode Driver.
              Graphics Hardware
                                                                     Hardware
문제가 있었으니, 바꾼 것이겠죠?



 XPDM    WDDM
WDDM은
GPU 활용을 위한
새로운 모델입니다!

  Vista OS는 WDDM 1.0
   W7 OS는 WDDM 1.1
OS 가 GPU를 활용한다는 것은

- GPU 스케줄러
- GPU 메모리 관리자

 GPU가 처리한 결과를
CPU에서 접근 가능한가?
XP OS 는
GPU 처리 능력이 없습니다!
그렇다면, XP 에서
DX10 그래픽카드를 사용한다면?
코드의 수정은
위험도를 증가시킵니다!
DirectX9 는 싱글 코어 기반의 API
DirectX10 은 멀티 코어 기반의 API


 XP 는 싱글 코어의 종료를
    알리는 OS입니다!
DirectX11 은
10의 확장판입니다
렌더링을 위해서
멀티 코어를 활용해 봅시다!!!
free
           thread




Renderin
   g
Command
Thread 1 :



    D3D :




Thread 2 :
DC1
T1




T2
DC2
Render Command
DC1
T1




T2
DC2
      Render Command
FinishCommandList()
DC1
T1




T2
DC2

      FinishCommandList()
DC1
T1

      CommandBuffer




T2
DC2
Start New Render Command
DC1
T1




T2
DC2
      Start New Render Command
FinishCommandList()
DC1
T1

          CommandBuffer



T2
DC2
      FinishCommandList()
RenderMainThread   IMM
DC1                                 DC

T1

CommandBuffer




T2
DC2
RenderMainThread   IMM
DC1                                 DC

T1                 ExecuteCommandList

CommandBuffer




T2
DC2
RenderMainThread   IMM
DC1                                 DC

T1                 ExecuteCommandList

CommandBuffer
                   ExecuteCommandList



T2
DC2
RenderMainThread   IMM
DC1                                 DC

T1                 ExecuteCommandList

CommandBuffer
                   ExecuteCommandList


                   ExecuteCommandList
T2
DC2
쿼드 코어 이상에서
효과가 있습니다!
멀티코어를 활용했으니,
이제 GPU를 활용해 봅시다!
CPU
CPU 0      CPU 1



CPU 2      CPU 3




    L2 Cache
SIMD   SIMD    SIMD      SIMD   SIMD
SIMD   SIMD    SIMD      SIMD   SIMD
SIMD   SIMD    SIMD      SIMD   SIMD
SIMD   SIMD    SIMD      SIMD   SIMD
SIMD   SIMD    SIMD      SIMD   SIMD
SIMD   SIMD    SIMD      SIMD   SIMD
SIMD   SIMD    SIMD      SIMD   SIMD
SIMD   SIMD    SIMD      SIMD   SIMD
              L2 Cache
CPU                  GPU
50GFlops              1TFlop
              1GB/s


     10GB/s                    100GB/s



                      GPU RAM
CPU RAM                 1 GB
 4-6 GB
놀고 있는 GPU 에게
일을 시키고 싶었다!!

 DirectCompute!!!!
GPU          Video Memory
(SIMD Engine )
GPU          Video Memory
(SIMD Engine )
GPU          Video Memory
(SIMD Engine )


  SimpleCS
GPU            Video Memory
(SIMD Engine )


  SimpleCS       Buffer0( For Data )
GPU             Video Memory
(SIMD Engine )


  SimpleCS       Buffer0( For Data )


                 Buffer1( For Result )
GPU                   Video Memory
(SIMD Engine )


  SimpleCS       SRV   Buffer0( For Data )


                       Buffer1( For Result )
GPU                   Video Memory
(SIMD Engine )


  SimpleCS       SRV   Buffer0( For Data )


                 UAV   Buffer1( For Result )
GPU                   Video Memory
(SIMD Engine )


  SimpleCS       SRV   Buffer0( For Data )


                 UAV   Buffer1( For Result )
GPU                   Video Memory
(SIMD Engine )


  SimpleCS       SRV   Buffer0( For Data )


                 UAV   Buffer1( For Result )
GPU                   Video Memory
(SIMD Engine )


  SimpleCS       SRV   Buffer0( For Data )


                 UAV   Buffer1( For Result )
GPU                     Video Memory
(SIMD Engine )


  SimpleCS         SRV   Buffer0( For Data )

 SIMD       SIMD
                   UAV   Buffer1( For Result )
 SIMD       SIMD

        …
DirectCompute는
무척 어려운(?) 작업입니다!
그래서 등장한 것이 AMP!!
( 다음 버전의 Visual Studio에서 등장 예정 )



      AMP 가 무엇인가?
AMP는
쉬운 GPGPU 환경 구축이 목적
C++ 기반의 템플릿으로 제작
C++ 0x 일부 사용( 필수 )
어떻게 하면
 쉽게 GPGPU를
활용할 수 있을까?
STL처럼 널리 개발자를
  이롭게 하고 싶다!
#include<amp.h>
SomeFunc( … ) restrict( cpu )
{
  …
}
SomeFunc( … ) restrict( direct3d )
{
  …
}
SomeFunc( … ) restrict( cpu,
                    direct3d )
{
  …
}
이런 구조로 등장합니다.
accelerator ?
    runtime ?
    lambda ?
concurrency ?
합 구하기 ( CPU )
void AddArrays(int n, int * pA, int * pB, int * pC)
{
  for (int i=0; i<n; i++)
  {
       pC[i] = pA[i] + pB[i];
  }
}
합 구하기 ( GPU )
#include <amp.h>
using namespace concurrency;

void AddArrays(int n, int * pA, int * pB, int * pC)
{
  array_view<int,1> a(n, pA);
  array_view<int,1> b(n, pB);
  array_view<int,1> sum(n, pC);

    parallel_for_each(
       sum.grid,
       [=](index<1> i) restrict(direct3d)
       {
         sum[i] = a[i] + b[i];
       }
    );
}
#include <amp.h>
using namespace concurrency;

void AddArrays(int n, int * pA, int * pB, int * pC)
{
  array_view<int,1> a(n, pA);
  array_view<int,1> b(n, pB);
  array_view<int,1> sum(n, pC);

                 #include<amp.h>
    parallel_for_each(
       sum.grid,

       {         using namespace concurrency;
       [=](index<1> i) restrict(direct3d)

         sum[i] = a[i] + b[i];
       }
    );
}
#include <amp.h>
using namespace concurrency;

void AddArrays(int n, int * pA, int * pB, int * pC)
{
  array_view<int,1> a(n, pA);
  array_view<int,1> b(n, pB);
  array_view<int,1> sum(n, pC);

    parallel_for_each(
       sum.grid,

                     array_view< int, 1 > a( … );
       [=](index<1> i) restrict(direct3d)
       {
         sum[i] = a[i] + b[i];

    );
       }
                     array_view< int, 1 > b( … );
                     array_view< int, 1 > sum( … );
}
#include <amp.h>
using namespace concurrency;

void AddArrays(int n, int * pA, int * pB, int * pC)
{
  array_view<int,1> a(n, pA);
  array_view<int,1> b(n, pB);
  array_view<int,1> sum(n, pC);

    parallel_for_each(
       sum.grid,
       [=](index<1> i) restrict(direct3d)
       {
         sum[i] = a[i] + b[i];
       }

                     parrallel_for_each( lambda )
    );
}
#include <amp.h>
using namespace concurrency;

void AddArrays(int n, int * pA, int * pB, int * pC)
{
  array_view<int,1> a(n, pA);
  array_view<int,1> b(n, pB);
  array_view<int,1> sum(n, pC);

    parallel_for_each(
       sum.grid,
       [=](index<1> i) restrict(direct3d)
       {
         sum[i] = a[i] + b[i];
       }

                     sum.grid
    );
}
#include <amp.h>
using namespace concurrency;

void AddArrays(int n, int * pA, int * pB, int * pC)
{
  array_view<int,1> a(n, pA);
  array_view<int,1> b(n, pB);
  array_view<int,1> sum(n, pC);

    parallel_for_each(
       sum.grid,
       [=](index<1> i) restrict(direct3d)
       {
         sum[i] = a[i] + b[i];
       }
    );

                 [=](index<1> i )
}
#include <amp.h>
using namespace concurrency;

void AddArrays(int n, int * pA, int * pB, int * pC)
{
  array_view<int,1> a(n, pA);
  array_view<int,1> b(n, pB);
  array_view<int,1> sum(n, pC);

    parallel_for_each(
       sum.grid,
       [=](index<1> i) restrict(direct3d)
       {
         sum[i] = a[i] + b[i];
       }
    );

                                                 restrict( direct3d )
}
Thread를 다루는 작업이
   이렇게 간단하게?


샘플이 간단한 것이니 가능!!!
Thread 그룹화로 최적화!
Tilling
    0   1   2   3   4   5       0   1   2   3   4   5       0   1   2   3   4   5
0                           0                           0

1                           1                           1

2                           2                           2

3                           3                           3

4                           4                           4

5                           5                           5

6                           6                           6

7                           7                           7

extent<2> e(8,6);                   g.tile<4,3>()               g.tile<2,2>()
grid<2> g(e);
pDev11->Dispatch(3, 2, 1);

[numthreads(4, 4, 1)]
void MyCS(…)
tiled_grid, tiled_index
                                           0 1 2 3 4 5
                                       0
                                       1
                                       2
                                       3
t_idx.global        = index<2> (6,3)
t_idx.local         = index<2> (0,1)
                                       4
t_idx.tile          = index<2> (3,1)   5
t_idx.tile_origin   = index<2> (6,2)
                                       6         T
                                       7
그룹 최적화의 관건은…



tile_static
tile_barrier
void MatrixMultSimple(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W )
{

    array_view<const float,2> a(M, W, vA), b(W, N, vB);
    array_view<writeonly<float>,2> c(M,N,vC);
    parallel_for_each(c.grid,
      [=] (index<2> idx) restrict(direct3d) {
        int row = idx[0]; int col = idx[1];
        float sum = 0.0f;




        for(int k = 0; k < W; k++)
          sum += a(row, k) * b(k, col);


         c[idx] = sum;
      } );
}
void MatrixMultTiled(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W )
{
  static const int TS = 16;
  array_view<const float,2> a(M, W, vA), b(W, N, vB);
  array_view<writeonly<float>,2> c(M,N,vC);
  parallel_for_each(c.grid.tile< TS, TS >(),
    [=] (tiled_index< TS, TS> t_idx) restrict(direct3d) {
       int row = t_idx.local[0]; int col = t_idx.local[1];
       float sum = 0.0f;
       for (int i = 0; i < W; i += TS) {
          tile_static float locA[TS][TS], locB[TS][TS];
          locA[row][col] = a(t_idx.global[0], col + i);

               static const int TS = 16;
          locB[row][col] = b(row + i, t_idx.global[1]);
          t_idx.barrier.wait();

        for (int k = 0; k < TS; k++)
          sum += locA[row][k] * locB[k][col];
        t_idx.barrier.wait();
         }
       c[t_idx.global] = sum;
    } );
}
void MatrixMultTiled(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W )
{
  static const int TS = 16;
  array_view<const float,2> a(M, W, vA), b(W, N, vB);
  array_view<writeonly<float>,2> c(M,N,vC);
  parallel_for_each(c.grid.tile< TS, TS >(),
    [=] (tiled_index< TS, TS> t_idx) restrict(direct3d) {
       int row = t_idx.local[0]; int col = t_idx.local[1];
       float sum = 0.0f;
       for (int i = 0; i < W; i += TS) {
          tile_static float locA[TS][TS], locB[TS][TS];
          locA[row][col] = a(t_idx.global[0], col + i);

    parallel_for_each( c.grid.tile< TS, TS >(), … )
          locB[row][col] = b(row + i, t_idx.global[1]);
          t_idx.barrier.wait();

         for (int k = 0; k < TS; k++)
           sum += locA[row][k] * locB[k][col];
         t_idx.barrier.wait();
          }
        c[t_idx.global] = sum;
     } );
}
void MatrixMultTiled(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W )
{
  static const int TS = 16;
  array_view<const float,2> a(M, W, vA), b(W, N, vB);
  array_view<writeonly<float>,2> c(M,N,vC);
  parallel_for_each(c.grid.tile< TS, TS >(),
    [=] (tiled_index< TS, TS> t_idx) restrict(direct3d) {
       int row = t_idx.local[0]; int col = t_idx.local[1];
       float sum = 0.0f;
       for (int i = 0; i < W; i += TS) {
          tile_static float locA[TS][TS], locB[TS][TS];
          locA[row][col] = a(t_idx.global[0], col + i);
          locB[row][col] = b(row + i, t_idx.global[1]);

    [=](tiled_index< TS, TS > t_idx )
          t_idx.barrier.wait();

       for (int k = 0; k < TS; k++)
          sum += locA[row][k] * locB[k][col];
        t_idx.barrier.wait();
         }
       c[t_idx.global] = sum;
    } );
}
void MatrixMultTiled(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W )
{
  static const int TS = 16;
  array_view<const float,2> a(M, W, vA), b(W, N, vB);
  array_view<writeonly<float>,2> c(M,N,vC);
  parallel_for_each(c.grid.tile< TS, TS >(),
    [=] (tiled_index< TS, TS> t_idx) restrict(direct3d) {
       int row = t_idx.local[0]; int col = t_idx.local[1];
       float sum = 0.0f;
       for (int i = 0; i < W; i += TS) {
          tile_static float locA[TS][TS], locB[TS][TS];
          locA[row][col] = a(t_idx.global[0], col + i);
          locB[row][col] = b(row + i, t_idx.global[1]);
          t_idx.barrier.wait();

        for (int k = 0; k < TS; k++)
          sum += locA[row][k] * locB[k][col];

                      tile_static_float locA[TS][TS], …
        t_idx.barrier.wait();
         }
       c[t_idx.global] = sum;

}
    } );
                      locA[row][col] = a( … );
void MatrixMultTiled(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W )
{
  static const int TS = 16;
  array_view<const float,2> a(M, W, vA), b(W, N, vB);
  array_view<writeonly<float>,2> c(M,N,vC);
  parallel_for_each(c.grid.tile< TS, TS >(),
    [=] (tiled_index< TS, TS> t_idx) restrict(direct3d) {
       int row = t_idx.local[0]; int col = t_idx.local[1];
       float sum = 0.0f;
       for (int i = 0; i < W; i += TS) {
          tile_static float locA[TS][TS], locB[TS][TS];
          locA[row][col] = a(t_idx.global[0], col + i);
          locB[row][col] = b(row + i, t_idx.global[1]);
          t_idx.barrier.wait();

        for (int k = 0; k < TS; k++)
          sum += locA[row][k] * locB[k][col];

                      t_idx.barrier.wait();
        t_idx.barrier.wait();
         }
       c[t_idx.global] = sum;
    } );
}
void MatrixMultTiled(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W )
{
  static const int TS = 16;
  array_view<const float,2> a(M, W, vA), b(W, N, vB);
  array_view<writeonly<float>,2> c(M,N,vC);
  parallel_for_each(c.grid.tile< TS, TS >(),
    [=] (tiled_index< TS, TS> t_idx) restrict(direct3d) {
       int row = t_idx.local[0]; int col = t_idx.local[1];
       float sum = 0.0f;
       for (int i = 0; i < W; i += TS) {
          tile_static float locA[TS][TS], locB[TS][TS];
          locA[row][col] = a(t_idx.global[0], col + i);
          locB[row][col] = b(row + i, t_idx.global[1]);
          t_idx.barrier.wait();

        for (int k = 0; k < TS; k++)
          sum += locA[row][k] * locB[k][col];
        t_idx.barrier.wait();
         }
       c[t_idx.global] = sum;

}
    } );
                      t_idx.barrier.wait();
void MatrixMultTiled(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W )
{
  static const int TS = 16;
  array_view<const float,2> a(M, W, vA), b(W, N, vB);
  array_view<writeonly<float>,2> c(M,N,vC);
  parallel_for_each(c.grid.tile< TS, TS >(),
    [=] (tiled_index< TS, TS> t_idx) restrict(direct3d) {
       int row = t_idx.local[0]; int col = t_idx.local[1];
       float sum = 0.0f;
       for (int i = 0; i < W; i += TS) {
          tile_static float locA[TS][TS], locB[TS][TS];

               c[ t_idx.global ] = sum;
          locA[row][col] = a(t_idx.global[0], col + i);
          locB[row][col] = b(row + i, t_idx.global[1]);
          t_idx.barrier.wait();

        for (int k = 0; k < TS; k++)
          sum += locA[row][k] * locB[k][col];
        t_idx.barrier.wait();
         }
       c[t_idx.global] = sum;
    } );
}
일반 프로그래밍 보다
 난이도가 높습니다.

하지만 Visual Studio 에서
 완벽 지원할 것입니다.
     ( 디버깅 가능 )
Parallel Stacks




              56 GPU Threads
이 외에도…

테셀레이션
멀티 패스 렌더링
XNA MATH
…
Q&A

More Related Content

What's hot

Tips and experience_of_dx12_engine_development._ver_1.2
Tips and experience_of_dx12_engine_development._ver_1.2Tips and experience_of_dx12_engine_development._ver_1.2
Tips and experience_of_dx12_engine_development._ver_1.2
YEONG-CHEON YOU
 
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기
헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기zupet
 
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
khuhacker
 
이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스
이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스
이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스
Seunghwa Song
 
[0204 구경원] sse 병렬 프로그래밍
[0204 구경원] sse 병렬 프로그래밍[0204 구경원] sse 병렬 프로그래밍
[0204 구경원] sse 병렬 프로그래밍KyeongWon Koo
 
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
YEONG-CHEON YOU
 
Introduction to DirectX 12 Programming , Ver 1.5
Introduction to DirectX 12 Programming , Ver 1.5Introduction to DirectX 12 Programming , Ver 1.5
Introduction to DirectX 12 Programming , Ver 1.5
YEONG-CHEON YOU
 
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
Jaeseung Ha
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)
YEONG-CHEON YOU
 
Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기
YEONG-CHEON YOU
 
Introduction to Parallel Programming
Introduction to Parallel ProgrammingIntroduction to Parallel Programming
Introduction to Parallel Programming
UNIST
 
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
YEONG-CHEON YOU
 
Modern gpu optimize
Modern gpu optimizeModern gpu optimize
Modern gpu optimize
ozlael ozlael
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
Jaeseung Ha
 
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
Jaeseung Ha
 
GPU를 위한 병렬 음원 방향 추정 알고리즘
GPU를 위한 병렬 음원 방향 추정 알고리즘GPU를 위한 병렬 음원 방향 추정 알고리즘
GPU를 위한 병렬 음원 방향 추정 알고리즘
Taewoo Lee
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
NAVER D2
 
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요? (2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
내훈 정
 
DirectX + C++을 이용한 WindowsStore App과 Windows Phone용 게임 개발
DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발
DirectX + C++을 이용한 WindowsStore App과 Windows Phone용 게임 개발
YEONG-CHEON YOU
 

What's hot (20)

Tips and experience_of_dx12_engine_development._ver_1.2
Tips and experience_of_dx12_engine_development._ver_1.2Tips and experience_of_dx12_engine_development._ver_1.2
Tips and experience_of_dx12_engine_development._ver_1.2
 
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기
헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기
 
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
 
이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스
이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스
이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스
 
[0204 구경원] sse 병렬 프로그래밍
[0204 구경원] sse 병렬 프로그래밍[0204 구경원] sse 병렬 프로그래밍
[0204 구경원] sse 병렬 프로그래밍
 
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
 
Introduction to DirectX 12 Programming , Ver 1.5
Introduction to DirectX 12 Programming , Ver 1.5Introduction to DirectX 12 Programming , Ver 1.5
Introduction to DirectX 12 Programming , Ver 1.5
 
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)
 
Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기
 
Cuda intro
Cuda introCuda intro
Cuda intro
 
Introduction to Parallel Programming
Introduction to Parallel ProgrammingIntroduction to Parallel Programming
Introduction to Parallel Programming
 
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
 
Modern gpu optimize
Modern gpu optimizeModern gpu optimize
Modern gpu optimize
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
 
GPU를 위한 병렬 음원 방향 추정 알고리즘
GPU를 위한 병렬 음원 방향 추정 알고리즘GPU를 위한 병렬 음원 방향 추정 알고리즘
GPU를 위한 병렬 음원 방향 추정 알고리즘
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
 
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요? (2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
 
DirectX + C++을 이용한 WindowsStore App과 Windows Phone용 게임 개발
DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발
DirectX + C++을 이용한 WindowsStore App과 Windows Phone용 게임 개발
 

Similar to [조진현] [Kgc2011]direct x11 이야기

[0602 박민근] direct2 d
[0602 박민근] direct2 d[0602 박민근] direct2 d
[0602 박민근] direct2 dMinGeun Park
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012Esun Kim
 
Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900Samsung Electronics
 
Flash Player 11과 AIR 3 환경에서 3D 개발
Flash Player 11과 AIR 3 환경에서 3D 개발Flash Player 11과 AIR 3 환경에서 3D 개발
Flash Player 11과 AIR 3 환경에서 3D 개발Yongho Ji
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012devCAT Studio, NEXON
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
YEONG-CHEON YOU
 
Compute shader DX11
Compute shader DX11Compute shader DX11
Compute shader DX11
민웅 이
 
Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blog
ozlael ozlael
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shadingMinGeun Park
 
3D Engine (ICON 2007)
3D Engine (ICON 2007)3D Engine (ICON 2007)
3D Engine (ICON 2007)
SeongWan Kim
 
kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340Samsung Electronics
 
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013devCAT Studio, NEXON
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D
흥배 최
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhudMinGeun Park
 
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
chcbaram
 
Direct3d overview
Direct3d overviewDirect3d overview
Direct3d overview문익 장
 
이권일 Sse 를 이용한 최적화와 실제 사용 예
이권일 Sse 를 이용한 최적화와 실제 사용 예이권일 Sse 를 이용한 최적화와 실제 사용 예
이권일 Sse 를 이용한 최적화와 실제 사용 예zupet
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013Esun Kim
 
Jnetpcap quickguide
Jnetpcap quickguideJnetpcap quickguide
Jnetpcap quickguideSukjin Yun
 
아두이노와 Fpga를 이용한 로봇제작
아두이노와 Fpga를 이용한 로봇제작아두이노와 Fpga를 이용한 로봇제작
아두이노와 Fpga를 이용한 로봇제작
chcbaram
 

Similar to [조진현] [Kgc2011]direct x11 이야기 (20)

[0602 박민근] direct2 d
[0602 박민근] direct2 d[0602 박민근] direct2 d
[0602 박민근] direct2 d
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
 
Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900
 
Flash Player 11과 AIR 3 환경에서 3D 개발
Flash Player 11과 AIR 3 환경에서 3D 개발Flash Player 11과 AIR 3 환경에서 3D 개발
Flash Player 11과 AIR 3 환경에서 3D 개발
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
Compute shader DX11
Compute shader DX11Compute shader DX11
Compute shader DX11
 
Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blog
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading
 
3D Engine (ICON 2007)
3D Engine (ICON 2007)3D Engine (ICON 2007)
3D Engine (ICON 2007)
 
kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340
 
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
 
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
 
Direct3d overview
Direct3d overviewDirect3d overview
Direct3d overview
 
이권일 Sse 를 이용한 최적화와 실제 사용 예
이권일 Sse 를 이용한 최적화와 실제 사용 예이권일 Sse 를 이용한 최적화와 실제 사용 예
이권일 Sse 를 이용한 최적화와 실제 사용 예
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
 
Jnetpcap quickguide
Jnetpcap quickguideJnetpcap quickguide
Jnetpcap quickguide
 
아두이노와 Fpga를 이용한 로봇제작
아두이노와 Fpga를 이용한 로봇제작아두이노와 Fpga를 이용한 로봇제작
아두이노와 Fpga를 이용한 로봇제작
 

More from 진현 조

[Gpg2권 조진현] 1.2 인라인 함수 대 매크로
[Gpg2권 조진현] 1.2 인라인 함수 대 매크로[Gpg2권 조진현] 1.2 인라인 함수 대 매크로
[Gpg2권 조진현] 1.2 인라인 함수 대 매크로진현 조
 
[Gpg1권 조진현] 5.6 하드웨어 범프 매핑
[Gpg1권 조진현] 5.6 하드웨어 범프 매핑[Gpg1권 조진현] 5.6 하드웨어 범프 매핑
[Gpg1권 조진현] 5.6 하드웨어 범프 매핑진현 조
 
[Gpg1권 조진현] 5.6 하드웨어 범프 매핑
[Gpg1권 조진현] 5.6 하드웨어 범프 매핑[Gpg1권 조진현] 5.6 하드웨어 범프 매핑
[Gpg1권 조진현] 5.6 하드웨어 범프 매핑진현 조
 
[Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈
[Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈 [Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈
[Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈 진현 조
 
[0319 조진현] 뇌를 자극하는 드라마 & 책
[0319 조진현] 뇌를 자극하는 드라마 & 책[0319 조진현] 뇌를 자극하는 드라마 & 책
[0319 조진현] 뇌를 자극하는 드라마 & 책진현 조
 
[Gpg1권 조진현] 4.6 다해상도 맵을 이용한 충돌 판정
[Gpg1권 조진현] 4.6 다해상도 맵을 이용한 충돌 판정[Gpg1권 조진현] 4.6 다해상도 맵을 이용한 충돌 판정
[Gpg1권 조진현] 4.6 다해상도 맵을 이용한 충돌 판정진현 조
 
[1218 조진현] 폐차쿠챠 특집 행복한-게임개발자_되기
[1218 조진현] 폐차쿠챠 특집   행복한-게임개발자_되기[1218 조진현] 폐차쿠챠 특집   행복한-게임개발자_되기
[1218 조진현] 폐차쿠챠 특집 행복한-게임개발자_되기진현 조
 
[0108 조진현]출발 소프트웨어 렌더러
[0108 조진현]출발 소프트웨어 렌더러[0108 조진현]출발 소프트웨어 렌더러
[0108 조진현]출발 소프트웨어 렌더러진현 조
 
[1211 조진현][gpg1]플로킹
[1211 조진현][gpg1]플로킹[1211 조진현][gpg1]플로킹
[1211 조진현][gpg1]플로킹진현 조
 
[1106 조진현] if you( batch rendering )
[1106 조진현] if you( batch rendering )[1106 조진현] if you( batch rendering )
[1106 조진현] if you( batch rendering )진현 조
 
[1002 조진현]unity3d 소개
[1002 조진현]unity3d 소개[1002 조진현]unity3d 소개
[1002 조진현]unity3d 소개
진현 조
 

More from 진현 조 (11)

[Gpg2권 조진현] 1.2 인라인 함수 대 매크로
[Gpg2권 조진현] 1.2 인라인 함수 대 매크로[Gpg2권 조진현] 1.2 인라인 함수 대 매크로
[Gpg2권 조진현] 1.2 인라인 함수 대 매크로
 
[Gpg1권 조진현] 5.6 하드웨어 범프 매핑
[Gpg1권 조진현] 5.6 하드웨어 범프 매핑[Gpg1권 조진현] 5.6 하드웨어 범프 매핑
[Gpg1권 조진현] 5.6 하드웨어 범프 매핑
 
[Gpg1권 조진현] 5.6 하드웨어 범프 매핑
[Gpg1권 조진현] 5.6 하드웨어 범프 매핑[Gpg1권 조진현] 5.6 하드웨어 범프 매핑
[Gpg1권 조진현] 5.6 하드웨어 범프 매핑
 
[Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈
[Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈 [Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈
[Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈
 
[0319 조진현] 뇌를 자극하는 드라마 & 책
[0319 조진현] 뇌를 자극하는 드라마 & 책[0319 조진현] 뇌를 자극하는 드라마 & 책
[0319 조진현] 뇌를 자극하는 드라마 & 책
 
[Gpg1권 조진현] 4.6 다해상도 맵을 이용한 충돌 판정
[Gpg1권 조진현] 4.6 다해상도 맵을 이용한 충돌 판정[Gpg1권 조진현] 4.6 다해상도 맵을 이용한 충돌 판정
[Gpg1권 조진현] 4.6 다해상도 맵을 이용한 충돌 판정
 
[1218 조진현] 폐차쿠챠 특집 행복한-게임개발자_되기
[1218 조진현] 폐차쿠챠 특집   행복한-게임개발자_되기[1218 조진현] 폐차쿠챠 특집   행복한-게임개발자_되기
[1218 조진현] 폐차쿠챠 특집 행복한-게임개발자_되기
 
[0108 조진현]출발 소프트웨어 렌더러
[0108 조진현]출발 소프트웨어 렌더러[0108 조진현]출발 소프트웨어 렌더러
[0108 조진현]출발 소프트웨어 렌더러
 
[1211 조진현][gpg1]플로킹
[1211 조진현][gpg1]플로킹[1211 조진현][gpg1]플로킹
[1211 조진현][gpg1]플로킹
 
[1106 조진현] if you( batch rendering )
[1106 조진현] if you( batch rendering )[1106 조진현] if you( batch rendering )
[1106 조진현] if you( batch rendering )
 
[1002 조진현]unity3d 소개
[1002 조진현]unity3d 소개[1002 조진현]unity3d 소개
[1002 조진현]unity3d 소개
 

[조진현] [Kgc2011]direct x11 이야기

  • 1. DirectX11 이야기 조 진현( GOGN ) Microsoft DirectX MVP VS2010 팀 블로그( www.vsts2010.net )
  • 3. 현재 DX 최신 버전은 DirectX 11.1
  • 4.
  • 5. 9  11 끊어진 흐름을 채우자!
  • 6.  이 분이 얘기하시기를…
  • 7. DX 8 -> DX 9 성형 전 -> 성형 후
  • 8. DX 9 -> DX 10 (11) 완전히 새로운 아키텍쳐
  • 11. 버전이 올라갈 수록 더 빠르고 더 안정적이고 더 풍부하고 더…
  • 13. 시대는 점점… Multi Thread Multi CPU Multi GPU Multi APU
  • 14. 갑자기 하드웨어가 변했다니?
  • 15.
  • 16.
  • 18. 우리가 하는 일은 API를 제어하는 것입니다!
  • 19.
  • 22. 우리 OS 의 변화가 변했어요~
  • 23.
  • 25. 왜 DirectX 10 에 주목해야 하는가?
  • 26. 처음부터 새롭게 코딩 했습니다!!! 어떤 기준으로? ( 누구 마음대로? )
  • 28. Vista OS는 DirectX 10 W7 OS는 DirectX 10.1
  • 29. DirectX 10 은 XP 에서 실행되지 않습니다! 왜? ( 돈에 환장한 MS라서? )
  • 31. Win32 Application Win32 Application Win32 Application Direct3D API Future Direct3D API Graphics Components GDI User-Mode Driver HAL Device DXGI Device Driver Interface ( DDI ) Kernel-mode Driver. Graphics Hardware Hardware
  • 32. 문제가 있었으니, 바꾼 것이겠죠? XPDM  WDDM
  • 33. WDDM은 GPU 활용을 위한 새로운 모델입니다! Vista OS는 WDDM 1.0 W7 OS는 WDDM 1.1
  • 34. OS 가 GPU를 활용한다는 것은 - GPU 스케줄러 - GPU 메모리 관리자 GPU가 처리한 결과를 CPU에서 접근 가능한가?
  • 35.
  • 36. XP OS 는 GPU 처리 능력이 없습니다!
  • 37. 그렇다면, XP 에서 DX10 그래픽카드를 사용한다면?
  • 39. DirectX9 는 싱글 코어 기반의 API DirectX10 은 멀티 코어 기반의 API XP 는 싱글 코어의 종료를 알리는 OS입니다!
  • 41. 렌더링을 위해서 멀티 코어를 활용해 봅시다!!!
  • 42.
  • 43.
  • 44.
  • 45. free thread Renderin g Command
  • 46.
  • 47. Thread 1 : D3D : Thread 2 :
  • 50. FinishCommandList() DC1 T1 T2 DC2 FinishCommandList()
  • 51. DC1 T1 CommandBuffer T2 DC2
  • 52. Start New Render Command DC1 T1 T2 DC2 Start New Render Command
  • 53. FinishCommandList() DC1 T1 CommandBuffer T2 DC2 FinishCommandList()
  • 54. RenderMainThread IMM DC1 DC T1 CommandBuffer T2 DC2
  • 55. RenderMainThread IMM DC1 DC T1 ExecuteCommandList CommandBuffer T2 DC2
  • 56. RenderMainThread IMM DC1 DC T1 ExecuteCommandList CommandBuffer ExecuteCommandList T2 DC2
  • 57. RenderMainThread IMM DC1 DC T1 ExecuteCommandList CommandBuffer ExecuteCommandList ExecuteCommandList T2 DC2
  • 60. CPU
  • 61. CPU 0 CPU 1 CPU 2 CPU 3 L2 Cache
  • 62. SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD SIMD L2 Cache
  • 63. CPU GPU 50GFlops 1TFlop 1GB/s 10GB/s 100GB/s GPU RAM CPU RAM 1 GB 4-6 GB
  • 64. 놀고 있는 GPU 에게 일을 시키고 싶었다!! DirectCompute!!!!
  • 65.
  • 66.
  • 67. GPU Video Memory (SIMD Engine )
  • 68. GPU Video Memory (SIMD Engine )
  • 69. GPU Video Memory (SIMD Engine ) SimpleCS
  • 70. GPU Video Memory (SIMD Engine ) SimpleCS Buffer0( For Data )
  • 71. GPU Video Memory (SIMD Engine ) SimpleCS Buffer0( For Data ) Buffer1( For Result )
  • 72. GPU Video Memory (SIMD Engine ) SimpleCS SRV Buffer0( For Data ) Buffer1( For Result )
  • 73. GPU Video Memory (SIMD Engine ) SimpleCS SRV Buffer0( For Data ) UAV Buffer1( For Result )
  • 74. GPU Video Memory (SIMD Engine ) SimpleCS SRV Buffer0( For Data ) UAV Buffer1( For Result )
  • 75. GPU Video Memory (SIMD Engine ) SimpleCS SRV Buffer0( For Data ) UAV Buffer1( For Result )
  • 76. GPU Video Memory (SIMD Engine ) SimpleCS SRV Buffer0( For Data ) UAV Buffer1( For Result )
  • 77. GPU Video Memory (SIMD Engine ) SimpleCS SRV Buffer0( For Data ) SIMD SIMD UAV Buffer1( For Result ) SIMD SIMD …
  • 79. 그래서 등장한 것이 AMP!! ( 다음 버전의 Visual Studio에서 등장 예정 ) AMP 가 무엇인가?
  • 80. AMP는 쉬운 GPGPU 환경 구축이 목적 C++ 기반의 템플릿으로 제작 C++ 0x 일부 사용( 필수 )
  • 81. 어떻게 하면 쉽게 GPGPU를 활용할 수 있을까? STL처럼 널리 개발자를 이롭게 하고 싶다!
  • 83. SomeFunc( … ) restrict( cpu ) { … }
  • 84. SomeFunc( … ) restrict( direct3d ) { … }
  • 85. SomeFunc( … ) restrict( cpu, direct3d ) { … }
  • 87. accelerator ? runtime ? lambda ? concurrency ?
  • 88. 합 구하기 ( CPU ) void AddArrays(int n, int * pA, int * pB, int * pC) { for (int i=0; i<n; i++) { pC[i] = pA[i] + pB[i]; } }
  • 89. 합 구하기 ( GPU ) #include <amp.h> using namespace concurrency; void AddArrays(int n, int * pA, int * pB, int * pC) { array_view<int,1> a(n, pA); array_view<int,1> b(n, pB); array_view<int,1> sum(n, pC); parallel_for_each( sum.grid, [=](index<1> i) restrict(direct3d) { sum[i] = a[i] + b[i]; } ); }
  • 90. #include <amp.h> using namespace concurrency; void AddArrays(int n, int * pA, int * pB, int * pC) { array_view<int,1> a(n, pA); array_view<int,1> b(n, pB); array_view<int,1> sum(n, pC); #include<amp.h> parallel_for_each( sum.grid, { using namespace concurrency; [=](index<1> i) restrict(direct3d) sum[i] = a[i] + b[i]; } ); }
  • 91. #include <amp.h> using namespace concurrency; void AddArrays(int n, int * pA, int * pB, int * pC) { array_view<int,1> a(n, pA); array_view<int,1> b(n, pB); array_view<int,1> sum(n, pC); parallel_for_each( sum.grid, array_view< int, 1 > a( … ); [=](index<1> i) restrict(direct3d) { sum[i] = a[i] + b[i]; ); } array_view< int, 1 > b( … ); array_view< int, 1 > sum( … ); }
  • 92. #include <amp.h> using namespace concurrency; void AddArrays(int n, int * pA, int * pB, int * pC) { array_view<int,1> a(n, pA); array_view<int,1> b(n, pB); array_view<int,1> sum(n, pC); parallel_for_each( sum.grid, [=](index<1> i) restrict(direct3d) { sum[i] = a[i] + b[i]; } parrallel_for_each( lambda ) ); }
  • 93. #include <amp.h> using namespace concurrency; void AddArrays(int n, int * pA, int * pB, int * pC) { array_view<int,1> a(n, pA); array_view<int,1> b(n, pB); array_view<int,1> sum(n, pC); parallel_for_each( sum.grid, [=](index<1> i) restrict(direct3d) { sum[i] = a[i] + b[i]; } sum.grid ); }
  • 94. #include <amp.h> using namespace concurrency; void AddArrays(int n, int * pA, int * pB, int * pC) { array_view<int,1> a(n, pA); array_view<int,1> b(n, pB); array_view<int,1> sum(n, pC); parallel_for_each( sum.grid, [=](index<1> i) restrict(direct3d) { sum[i] = a[i] + b[i]; } ); [=](index<1> i ) }
  • 95. #include <amp.h> using namespace concurrency; void AddArrays(int n, int * pA, int * pB, int * pC) { array_view<int,1> a(n, pA); array_view<int,1> b(n, pB); array_view<int,1> sum(n, pC); parallel_for_each( sum.grid, [=](index<1> i) restrict(direct3d) { sum[i] = a[i] + b[i]; } ); restrict( direct3d ) }
  • 96. Thread를 다루는 작업이 이렇게 간단하게? 샘플이 간단한 것이니 가능!!!
  • 98. Tilling 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 extent<2> e(8,6); g.tile<4,3>() g.tile<2,2>() grid<2> g(e);
  • 100. tiled_grid, tiled_index 0 1 2 3 4 5 0 1 2 3 t_idx.global = index<2> (6,3) t_idx.local = index<2> (0,1) 4 t_idx.tile = index<2> (3,1) 5 t_idx.tile_origin = index<2> (6,2) 6 T 7
  • 102. void MatrixMultSimple(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W ) { array_view<const float,2> a(M, W, vA), b(W, N, vB); array_view<writeonly<float>,2> c(M,N,vC); parallel_for_each(c.grid, [=] (index<2> idx) restrict(direct3d) { int row = idx[0]; int col = idx[1]; float sum = 0.0f; for(int k = 0; k < W; k++) sum += a(row, k) * b(k, col); c[idx] = sum; } ); }
  • 103. void MatrixMultTiled(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W ) { static const int TS = 16; array_view<const float,2> a(M, W, vA), b(W, N, vB); array_view<writeonly<float>,2> c(M,N,vC); parallel_for_each(c.grid.tile< TS, TS >(), [=] (tiled_index< TS, TS> t_idx) restrict(direct3d) { int row = t_idx.local[0]; int col = t_idx.local[1]; float sum = 0.0f; for (int i = 0; i < W; i += TS) { tile_static float locA[TS][TS], locB[TS][TS]; locA[row][col] = a(t_idx.global[0], col + i); static const int TS = 16; locB[row][col] = b(row + i, t_idx.global[1]); t_idx.barrier.wait(); for (int k = 0; k < TS; k++) sum += locA[row][k] * locB[k][col]; t_idx.barrier.wait(); } c[t_idx.global] = sum; } ); }
  • 104. void MatrixMultTiled(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W ) { static const int TS = 16; array_view<const float,2> a(M, W, vA), b(W, N, vB); array_view<writeonly<float>,2> c(M,N,vC); parallel_for_each(c.grid.tile< TS, TS >(), [=] (tiled_index< TS, TS> t_idx) restrict(direct3d) { int row = t_idx.local[0]; int col = t_idx.local[1]; float sum = 0.0f; for (int i = 0; i < W; i += TS) { tile_static float locA[TS][TS], locB[TS][TS]; locA[row][col] = a(t_idx.global[0], col + i); parallel_for_each( c.grid.tile< TS, TS >(), … ) locB[row][col] = b(row + i, t_idx.global[1]); t_idx.barrier.wait(); for (int k = 0; k < TS; k++) sum += locA[row][k] * locB[k][col]; t_idx.barrier.wait(); } c[t_idx.global] = sum; } ); }
  • 105. void MatrixMultTiled(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W ) { static const int TS = 16; array_view<const float,2> a(M, W, vA), b(W, N, vB); array_view<writeonly<float>,2> c(M,N,vC); parallel_for_each(c.grid.tile< TS, TS >(), [=] (tiled_index< TS, TS> t_idx) restrict(direct3d) { int row = t_idx.local[0]; int col = t_idx.local[1]; float sum = 0.0f; for (int i = 0; i < W; i += TS) { tile_static float locA[TS][TS], locB[TS][TS]; locA[row][col] = a(t_idx.global[0], col + i); locB[row][col] = b(row + i, t_idx.global[1]); [=](tiled_index< TS, TS > t_idx ) t_idx.barrier.wait(); for (int k = 0; k < TS; k++) sum += locA[row][k] * locB[k][col]; t_idx.barrier.wait(); } c[t_idx.global] = sum; } ); }
  • 106. void MatrixMultTiled(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W ) { static const int TS = 16; array_view<const float,2> a(M, W, vA), b(W, N, vB); array_view<writeonly<float>,2> c(M,N,vC); parallel_for_each(c.grid.tile< TS, TS >(), [=] (tiled_index< TS, TS> t_idx) restrict(direct3d) { int row = t_idx.local[0]; int col = t_idx.local[1]; float sum = 0.0f; for (int i = 0; i < W; i += TS) { tile_static float locA[TS][TS], locB[TS][TS]; locA[row][col] = a(t_idx.global[0], col + i); locB[row][col] = b(row + i, t_idx.global[1]); t_idx.barrier.wait(); for (int k = 0; k < TS; k++) sum += locA[row][k] * locB[k][col]; tile_static_float locA[TS][TS], … t_idx.barrier.wait(); } c[t_idx.global] = sum; } } ); locA[row][col] = a( … );
  • 107. void MatrixMultTiled(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W ) { static const int TS = 16; array_view<const float,2> a(M, W, vA), b(W, N, vB); array_view<writeonly<float>,2> c(M,N,vC); parallel_for_each(c.grid.tile< TS, TS >(), [=] (tiled_index< TS, TS> t_idx) restrict(direct3d) { int row = t_idx.local[0]; int col = t_idx.local[1]; float sum = 0.0f; for (int i = 0; i < W; i += TS) { tile_static float locA[TS][TS], locB[TS][TS]; locA[row][col] = a(t_idx.global[0], col + i); locB[row][col] = b(row + i, t_idx.global[1]); t_idx.barrier.wait(); for (int k = 0; k < TS; k++) sum += locA[row][k] * locB[k][col]; t_idx.barrier.wait(); t_idx.barrier.wait(); } c[t_idx.global] = sum; } ); }
  • 108. void MatrixMultTiled(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W ) { static const int TS = 16; array_view<const float,2> a(M, W, vA), b(W, N, vB); array_view<writeonly<float>,2> c(M,N,vC); parallel_for_each(c.grid.tile< TS, TS >(), [=] (tiled_index< TS, TS> t_idx) restrict(direct3d) { int row = t_idx.local[0]; int col = t_idx.local[1]; float sum = 0.0f; for (int i = 0; i < W; i += TS) { tile_static float locA[TS][TS], locB[TS][TS]; locA[row][col] = a(t_idx.global[0], col + i); locB[row][col] = b(row + i, t_idx.global[1]); t_idx.barrier.wait(); for (int k = 0; k < TS; k++) sum += locA[row][k] * locB[k][col]; t_idx.barrier.wait(); } c[t_idx.global] = sum; } } ); t_idx.barrier.wait();
  • 109. void MatrixMultTiled(vector<float>& vC, const vector<float>& vA, const vector<float>& vB, int M, int N, int W ) { static const int TS = 16; array_view<const float,2> a(M, W, vA), b(W, N, vB); array_view<writeonly<float>,2> c(M,N,vC); parallel_for_each(c.grid.tile< TS, TS >(), [=] (tiled_index< TS, TS> t_idx) restrict(direct3d) { int row = t_idx.local[0]; int col = t_idx.local[1]; float sum = 0.0f; for (int i = 0; i < W; i += TS) { tile_static float locA[TS][TS], locB[TS][TS]; c[ t_idx.global ] = sum; locA[row][col] = a(t_idx.global[0], col + i); locB[row][col] = b(row + i, t_idx.global[1]); t_idx.barrier.wait(); for (int k = 0; k < TS; k++) sum += locA[row][k] * locB[k][col]; t_idx.barrier.wait(); } c[t_idx.global] = sum; } ); }
  • 110. 일반 프로그래밍 보다 난이도가 높습니다. 하지만 Visual Studio 에서 완벽 지원할 것입니다. ( 디버깅 가능 )
  • 111. Parallel Stacks 56 GPU Threads
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 118. Q&A