SlideShare uma empresa Scribd logo
1 de 38
CUDAプログラミング入門
株式会社フィックスターズ
リードエンジニア 飯塚拓郎
たったひとつでない、
  GPUプログラミングの冴えたやり方
        ready-to-useなライブラリを使う
        CUBLAS, CUFFT, CURAND, NPP, etc...


ディレクティブ+半自動並列化コンパイラを使う
             PGI Fortran, OpenACC



           CUDAプログラミングする
たったひとつでない、
     GPUプログラミングの冴えたやり方
              ready-to-useなライブラリを使う
✓ CUDAプログラミングのメリット
              CUBLAS, CUFFT, CURAND, NPP, etc...
 - 柔軟:GPUのロジックを自由に記述でき、細かい制御もできる

 - 高速:ロジックを命令レベルで最適化可能、データ転送のタイミングも自由
ディレクティブ+半自動並列化コンパイラを使う
 - 最新:GPUの最新のFeatureはまずCUDAに反映される
                     PGI Fortran, OpenACC



                  CUDAプログラミングしよう!
CUDA入門 基礎編
CPU vs GPU




   CPU                GPU
  ∼数十コア           ∼数百コア
複雑なコントロール部     単純なコントロール部
CUDAプログラミングモデル
    Host & Device

   CUDAアプリケーション

                    CUDA
 CUDA API
                 C Language




            通信
   CPU              GPU
CUDAプログラミングモデル
      Kernel → Thread → CUDA Core

                                CUDAカーネルには
                               各スレッドの処理を記述


                 CUDAスレッド群は
                 CUDAカーネルを実行
論理層


                   CUDAコアは
物理層             CUDAスレッドを順次実行


∼数十万ものスレッドを数百のコアで効率良く実行
CUDAプログラミングモデル
                Thread Hierarchy
✓ CUDAのスレッド空間は階層化されている
                                    Grid
 - 全体を構成するのが Grid
                                    Block
 - Grid の中に複数の Block
                           Thread
 - Thread の中に複数の Thread

✓ なぜ?

 - どんな構成のGPUでも
   同等スケールの性能を達成するため

 - 同期機構を提供しつつ、
   スケーラビリティを担保できる
CUDAプログラミング
          Basic Workflow

    CPU                   GPU
1.GPUメモリ確保
2.入力データ転送
3.カーネル呼び出し          4.カーネル実行



5.出力データ転送
6.GPUメモリ破棄
CUDAプログラミング
                    Basic CUDA API
✓ GPUメモリ確保/破棄

 - cudaMalloc(void** devPtr, size_t size)
 - cudaFree(void* devPtr)
✓ データ転送

 - cudaMemcpy(void* dst, void* src,
          size_t size, esize cudaMemcpyKind kind)

✓ カーネル呼び出し

 - kernel_function<<<grid_size, block_size>>>(...)
CUDA プログラミング
           Basic CUDA C Language
✓ CUDA C Languageとは?

  - CUDAのカーネルを書くための言語

  - 文法はほぼC/C++、ただし標準Cライブラリ等は使用できない

✓ 文法要素

  - __global__ void func(...)でfuncがカーネルとしてコンパイルされる

  - __device__ void func(...)でfuncがデバイス関数
    (カーネルから呼び出せる関数)としてコンパイルされる
配列の足し算
----左から続く----

#include <iostream>
#include <vector>                        // 2. 入力データ転送
// 4. カーネル実行                             cudaMemcpy(d_a, &a[0], size*sizeof(float),
                                               cudaMemcpyHostToDevice);
__global__                               cudaMemcpy(d_b, &b[0], size*sizeof(float),
void vecadd(float *a, float *b, float *c)         cudaMemcpyHostToDevice);
{
  c[threadIdx.x] = a[threadIdx.x]        dim3 grid_size = dim3(1, 1, 1);
            + b[threadIdx.x];            dim3 block_size = dim3(size, 1, 1);
}
                                         // 3. カーネル呼び出し
int main(int argc, char *argv[])
{                                        vecadd<<<grid_size,
  const int size = 16;                        block_size>>>(d_a, d_b, d_c);
  std::vector<float> a(size, 1);
  std::vector<float> b(size, 1);          // 5. 出力データ転送
  std::vector<float> c(size, 0);          cudaMemcpy(&c[0], d_c, size*sizeof(float),
                                               cudaMemcpyDeviceToHost);
 float *d_a, *d_b, *d_c;
                                         // 6. GPUメモリ破棄
 // 1. GPUメモリ確保
                                         cudaFree(d_a);
 cudaMalloc(&d_a, size*sizeof(float));    cudaFree(d_b);
 cudaMalloc(&d_b, size*sizeof(float));    cudaFree(d_c);
 cudaMalloc(&d_c, size*sizeof(float));
                                         for (int i=0; i<size; ++i)
                                         {
                ----右へ続く----               std::cout << c[i] << std::endl;
                                         }
コンパイル&実行

✓ コンパイル環境

 - NVIDIA CUDA Driver、 NVIDIA CUDA Toolkitをインストール

 - CUDAコンパイラ nvccを使う

   - CUDAヘッダファイルのインクルードや必要なライブラリのリンクは
     自動的にやってくれる

✓ 実行環境

 - *nix環境:cudart.so/dylibへのパスを環境変数LD_LIBRARY_PATHに追加
CUDA入門 応用編
GPUのアーキテクチャは進化する




Prev : GT200   Now : Fermi   Next : Kepler
その時CUDAプログラマに
           何が起こったか?
✓ プログラミングモデルが変わった

 - メモリ空間の統合によって
  メモリコピー操作が不要になった

✓ プログラミングの難易度が変わった

 - キャッシュによってメモリ局所性を
  意識しなくてよくなった



✓ 最適化方法が変わった
つまり?


✓GPUアーキテクチャと共に、
CUDAプログラミングも進化する



✓CUDAでそこそこの性能を出すことは、
どんどん簡単になってゆく
つまり?


✓GPUアーキテクチャと共に、
CUDAプログラミングも進化する



✓CUDAでそこそこの性能を出すことは、
どんどん簡単になってゆく
Unified Virtual Address Space

✓ Fermiアーキテクチャ+CUDA4.0ではCPUとGPUのメモリ空間が統合された

                  これにより・・・



✓ CPUとGPUのメモリ転送をプログラム中に書かなくて良くなった!

✓ 複数GPUを使用する際のメモリ転送をプログラム中に書かなくて良くなった!



              まさに いいことづくめ
配列の足し算(簡単編)
#include <iostream>

__global__
void vecadd(float *a, float *b, float *c)
{
  c[threadIdx.x] = a[threadIdx.x] + b[threadIdx.x];
}

int main(int argc, char *argv[])
{
  const int size = 16;
  float *a, *b, *c;

 cudaMallocHost(&a, size*sizeof(float));
 cudaMallocHost(&b, size*sizeof(float));

 for (int i=0; i<size; ++i) { a[i] = b[i] = 1; c[i] = 0; }

 cudaMallocHost(&c, size*sizeof(float));

 dim3 grid_size = dim3(1, 1, 1);
 dim3 block_size = dim3(size, 1, 1);

 vecadd<<<grid_size, block_size>>>(a, b, c);

 for (int i=0; i<size; ++i) std::cout << c[i] << std::endl;   注意:GT200アーキテクチャ




                                       すごく簡単
でも、例えば・・・


 CPU               GPU



Memory            Kernel


                           たくさん
         明らかに遅い            ループ
こうするべき


    CPU               GPU

   Memory            Memory




                     Kernel




明示的にDevice Memoryにキャッシュ
アーキテクチャを知ることが
        なぜ重要か?

✓今時のCUDAはデータフローが隠 されていて
簡単にプログラミングできる



          Great! But...


✓遅いプログラムも簡単にかけてしまう
つまり?


✓GPUアーキテクチャと共に、
CUDAプログラミングも進化する



✓CUDAでそこそこの性能を出すことは、
どんどん簡単になってゆく



        というよりも・・・
つまり?


✓GPUアーキテクチャと共に、
CUDAプログラミングも進化する



✓CUDAでそこそこの性能を出すことは、
どんどん簡単になってゆく
Fermiアーキテクチャ
Streaming Multiprocessor                   Streaming Multiprocessor


      CUDA Cores                                 CUDA Cores



L1 Cache      Shared                       L1 Cache      Shared
              Memory                                     Memory

 L2 Cache                                               L2 Cache


                           Device Memory



        PCI Express
I/O性能
✓ PCI Express 低速
       Streaming Multiprocessor  Streaming Multiprocessor
  -   レイテンシ:∼10us, スループット:∼8GB/s

  - CPU、チップセット、メインメモリ、PCIバスに性能が左右される
         CUDA Cores             CUDA Cores

✓ Device Memory 中速
               Shared                                      Shared
  - GDDR5、オンボード/オフチップ
      L1 Cache
               Memory
                                               L1 Cache
                                                           Memory

  - レイテンシ:∼500cycle, スループット:100~200GB/s
      L2 Cache                                            L2 Cache

✓ L2 Cache 中高速
                     Device Memory (on board, off chip)
  - 768KB
  - レイテンシ:∼200cycle
         PCI Express I/O
CacheとShared Memory
✓ 違い

  - L1/L2キャッシュによるキャッシュは暗黙的に行われる

  - Shared Memoryはカーネル中で明示的に使う

✓ Shared Memoryの使い方

  - 変数修飾子__shared__をつける

  __global__
  void kernel(float *ptr) {
   __shared__ float buf[16];      Shared Memoryの宣言とロード
   buf[16] = ptr[threadIdx.x];

   ...

   __syncthreads();                     同期命令

   ...
行列の掛け算
愚直な一手
  __global__
  void matmul_naive(float *a, float *b, float *c, int matrix_size)
  {
    const unsigned int xidx = blockIdx.x * blockDim.x + threadIdx.x;
    const unsigned int yidx = blockIdx.y * blockDim.y + threadIdx.y;

   float accumulator = 0.0;
   for (int i=0; i<matrix_size; ++i)
   {
     accumulator += a[yidx*matrix_size+i] * b[i*matrix_size+xidx];
   }
   c[yidx*matrix_size+xidx] = accumulator;



1. 計算結果の行列Cの要素ごとに1スレッドを割り当てる

  - 16x16のスレッドからなる、(matrix_size/16)x(matrix_size/16)のブロッ
     ク

2. xidx, yidxは行列Cの要素の添字になる
2x2ブロックの4x4行列の計算に
        単純化してみる
                      A   B
                      C   D
        ×         =



A   :   &     C   :       &

B    : &      D :  &
    ブロック内でデータを共有できれば
    計算に必要な領域は少なくてすむ
Shared Memoryでキャッシュ
               (Step1)
 1.0 1.0              1.0 1.0
 1.0 1.0              1.0 1.0
                  ×




1.0 1.0         1.0 1.0         2.0 2.0
           ×
1.0 1.0         1.0 1.0         2.0 2.0

  Shared Memory
Shared Memoryでキャッシュ
               (Step2)
          1.0 1.0
          1.0 1.0
                    ×
                        1.0 1.0
                        1.0 1.0



1.0 1.0         1.0 1.0           4.0 4.0
           ×
1.0 1.0         1.0 1.0           4.0 4.0

  Shared Memory
スマートな一手
__global__
void matmul_shared(float *a, float *b, float *c, int matrix_size)
{
  const unsigned int xidx = blockIdx.x * blockDim.x + threadIdx.x;
  const unsigned int yidx = blockIdx.y * blockDim.y + threadIdx.y;

 float accumulator = 0.0;
 for (int i=0; i<matrix_size; i+=16)
 {                                                    Shared Memoryの宣言とロー
   __shared__ float sub_a[16][16];
   __shared__ float sub_b[16][16];

     sub_a[threadIdx.y][threadIdx.x] = a[yidx*matrix_size+(i+threadIdx.x)];
     sub_b[threadIdx.y][threadIdx.x] = b[(i+threadIdx.y)*matrix_size+xidx];
                                                            Shared Memoryへの
     __syncthreads();

     for (int j=0; j<16; ++j)
     {
       accumulator += sub_a[threadIdx.y][j] * sub_b[j][threadIdx.x];
     }
                                                           Shared Memoryからの
     __syncthreads();
 }
まとめ

✓CUDAプログラミングは簡単です
 - プログラミング言語的にはC + α程度、単純なプログラムなら
  使用するAPIも10個以内ですむ

 - 「既存のCのコードをとりあえず動かだけ」すなら移植も楽

✓最適化方法はアプリ(問題の性質)に依存する、
まずGPUアーキテクチャを理解しよう

 - メモリI/Oのコストは一見隠されてはいるものの、
Thank you !

Mais conteúdo relacionado

Mais procurados

CMD2021 f01 xilinx_20210921_r1.1
CMD2021 f01 xilinx_20210921_r1.1CMD2021 f01 xilinx_20210921_r1.1
CMD2021 f01 xilinx_20210921_r1.1Yoshihiro Horie
 
Maxwell と Java CUDAプログラミング
Maxwell と Java CUDAプログラミングMaxwell と Java CUDAプログラミング
Maxwell と Java CUDAプログラミングNVIDIA Japan
 
A100 GPU 搭載! P4d インスタンス 使いこなしのコツ
A100 GPU 搭載! P4d インスタンス使いこなしのコツA100 GPU 搭載! P4d インスタンス使いこなしのコツ
A100 GPU 搭載! P4d インスタンス 使いこなしのコツKuninobu SaSaki
 
1070: CUDA プログラミング入門
1070: CUDA プログラミング入門1070: CUDA プログラミング入門
1070: CUDA プログラミング入門NVIDIA Japan
 
EnrootとPyxisで快適コンテナ生活
EnrootとPyxisで快適コンテナ生活EnrootとPyxisで快適コンテナ生活
EnrootとPyxisで快適コンテナ生活Kuninobu SaSaki
 
パタヘネゼミ 第6章
パタヘネゼミ 第6章パタヘネゼミ 第6章
パタヘネゼミ 第6章okuraofvegetable
 
1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門NVIDIA Japan
 
C#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめC#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめNVIDIA Japan
 
ログ解析を支えるNoSQLの技術
ログ解析を支えるNoSQLの技術ログ解析を支えるNoSQLの技術
ログ解析を支えるNoSQLの技術Drecom Co., Ltd.
 
20170421 tensor flowusergroup
20170421 tensor flowusergroup20170421 tensor flowusergroup
20170421 tensor flowusergroupManaMurakami1
 
GPGPU Seminar (GPGPU and CUDA Fortran)
GPGPU Seminar (GPGPU and CUDA Fortran)GPGPU Seminar (GPGPU and CUDA Fortran)
GPGPU Seminar (GPGPU and CUDA Fortran)智啓 出川
 
Chainer で Tensor コア (fp16) を使いこなす
Chainer で Tensor コア (fp16) を使いこなすChainer で Tensor コア (fp16) を使いこなす
Chainer で Tensor コア (fp16) を使いこなすNVIDIA Japan
 
Slurmのジョブスケジューリングと実装
Slurmのジョブスケジューリングと実装Slurmのジョブスケジューリングと実装
Slurmのジョブスケジューリングと実装Ryuichi Sakamoto
 
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」ManaMurakami1
 
20190625 OpenACC 講習会 第1部
20190625 OpenACC 講習会 第1部20190625 OpenACC 講習会 第1部
20190625 OpenACC 講習会 第1部NVIDIA Japan
 
2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア
2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア
2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア智啓 出川
 

Mais procurados (20)

UE4におけるLoadingとGCのProfilingと最適化手法
UE4におけるLoadingとGCのProfilingと最適化手法UE4におけるLoadingとGCのProfilingと最適化手法
UE4におけるLoadingとGCのProfilingと最適化手法
 
CMD2021 f01 xilinx_20210921_r1.1
CMD2021 f01 xilinx_20210921_r1.1CMD2021 f01 xilinx_20210921_r1.1
CMD2021 f01 xilinx_20210921_r1.1
 
Maxwell と Java CUDAプログラミング
Maxwell と Java CUDAプログラミングMaxwell と Java CUDAプログラミング
Maxwell と Java CUDAプログラミング
 
A100 GPU 搭載! P4d インスタンス 使いこなしのコツ
A100 GPU 搭載! P4d インスタンス使いこなしのコツA100 GPU 搭載! P4d インスタンス使いこなしのコツ
A100 GPU 搭載! P4d インスタンス 使いこなしのコツ
 
1070: CUDA プログラミング入門
1070: CUDA プログラミング入門1070: CUDA プログラミング入門
1070: CUDA プログラミング入門
 
EnrootとPyxisで快適コンテナ生活
EnrootとPyxisで快適コンテナ生活EnrootとPyxisで快適コンテナ生活
EnrootとPyxisで快適コンテナ生活
 
パタヘネゼミ 第6章
パタヘネゼミ 第6章パタヘネゼミ 第6章
パタヘネゼミ 第6章
 
1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門
 
C#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめC#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめ
 
ログ解析を支えるNoSQLの技術
ログ解析を支えるNoSQLの技術ログ解析を支えるNoSQLの技術
ログ解析を支えるNoSQLの技術
 
20170421 tensor flowusergroup
20170421 tensor flowusergroup20170421 tensor flowusergroup
20170421 tensor flowusergroup
 
20170518 eureka dli
20170518 eureka dli20170518 eureka dli
20170518 eureka dli
 
GPGPU Seminar (GPGPU and CUDA Fortran)
GPGPU Seminar (GPGPU and CUDA Fortran)GPGPU Seminar (GPGPU and CUDA Fortran)
GPGPU Seminar (GPGPU and CUDA Fortran)
 
activerecord-turntable
activerecord-turntableactiverecord-turntable
activerecord-turntable
 
Chainer で Tensor コア (fp16) を使いこなす
Chainer で Tensor コア (fp16) を使いこなすChainer で Tensor コア (fp16) を使いこなす
Chainer で Tensor コア (fp16) を使いこなす
 
コキュートスTfug
コキュートスTfugコキュートスTfug
コキュートスTfug
 
Slurmのジョブスケジューリングと実装
Slurmのジョブスケジューリングと実装Slurmのジョブスケジューリングと実装
Slurmのジョブスケジューリングと実装
 
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
 
20190625 OpenACC 講習会 第1部
20190625 OpenACC 講習会 第1部20190625 OpenACC 講習会 第1部
20190625 OpenACC 講習会 第1部
 
2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア
2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア
2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア
 

Semelhante a NVIDIA Japan Seminar 2012

GPGPUによるパーソナルスーパーコンピュータの可能性
GPGPUによるパーソナルスーパーコンピュータの可能性GPGPUによるパーソナルスーパーコンピュータの可能性
GPGPUによるパーソナルスーパーコンピュータの可能性Yusaku Watanabe
 
Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lisp
Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common LispLisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lisp
Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lispmasayukitakagi
 
CUDAプログラミング入門
CUDAプログラミング入門CUDAプログラミング入門
CUDAプログラミング入門NVIDIA Japan
 
Apache cloudstack4.0インストール
Apache cloudstack4.0インストールApache cloudstack4.0インストール
Apache cloudstack4.0インストールYasuhiro Arai
 
Hello, DirectCompute
Hello, DirectComputeHello, DirectCompute
Hello, DirectComputedasyprocta
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaandroid sola
 
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみるYasuhiro Yoshimura
 
Apache CloudStack 4.0 インストール(ver0.5)
Apache CloudStack 4.0 インストール(ver0.5)Apache CloudStack 4.0 インストール(ver0.5)
Apache CloudStack 4.0 インストール(ver0.5)Yasuhiro Arai
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門Yosuke Onoue
 
1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリNVIDIA Japan
 
Magnum IO GPUDirect Storage 最新情報
Magnum IO GPUDirect Storage 最新情報Magnum IO GPUDirect Storage 最新情報
Magnum IO GPUDirect Storage 最新情報NVIDIA Japan
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングComputational Materials Science Initiative
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介Preferred Networks
 
Windows Server 2016 で作るシンプルなハイパーコンバージドインフラ (Microsoft TechSummit 2016)
Windows Server 2016 で作るシンプルなハイパーコンバージドインフラ (Microsoft TechSummit 2016)Windows Server 2016 で作るシンプルなハイパーコンバージドインフラ (Microsoft TechSummit 2016)
Windows Server 2016 で作るシンプルなハイパーコンバージドインフラ (Microsoft TechSummit 2016)Takamasa Maejima
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LTKohei KaiGai
 
An Intelligent Storage?
An Intelligent Storage?An Intelligent Storage?
An Intelligent Storage?Kohei KaiGai
 
OpenStackを使用したGPU仮想化IaaS環境 事例紹介
OpenStackを使用したGPU仮想化IaaS環境 事例紹介OpenStackを使用したGPU仮想化IaaS環境 事例紹介
OpenStackを使用したGPU仮想化IaaS環境 事例紹介VirtualTech Japan Inc.
 

Semelhante a NVIDIA Japan Seminar 2012 (20)

GPGPUによるパーソナルスーパーコンピュータの可能性
GPGPUによるパーソナルスーパーコンピュータの可能性GPGPUによるパーソナルスーパーコンピュータの可能性
GPGPUによるパーソナルスーパーコンピュータの可能性
 
Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lisp
Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common LispLisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lisp
Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lisp
 
Cuda
CudaCuda
Cuda
 
CUDAプログラミング入門
CUDAプログラミング入門CUDAプログラミング入門
CUDAプログラミング入門
 
Apache cloudstack4.0インストール
Apache cloudstack4.0インストールApache cloudstack4.0インストール
Apache cloudstack4.0インストール
 
Hello, DirectCompute
Hello, DirectComputeHello, DirectCompute
Hello, DirectCompute
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsola
 
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
 
Apache CloudStack 4.0 インストール(ver0.5)
Apache CloudStack 4.0 インストール(ver0.5)Apache CloudStack 4.0 インストール(ver0.5)
Apache CloudStack 4.0 インストール(ver0.5)
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
 
1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ
 
Magnum IO GPUDirect Storage 最新情報
Magnum IO GPUDirect Storage 最新情報Magnum IO GPUDirect Storage 最新情報
Magnum IO GPUDirect Storage 最新情報
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
 
Windows Server 2016 で作るシンプルなハイパーコンバージドインフラ (Microsoft TechSummit 2016)
Windows Server 2016 で作るシンプルなハイパーコンバージドインフラ (Microsoft TechSummit 2016)Windows Server 2016 で作るシンプルなハイパーコンバージドインフラ (Microsoft TechSummit 2016)
Windows Server 2016 で作るシンプルなハイパーコンバージドインフラ (Microsoft TechSummit 2016)
 
Code jp2015 cpuの話
Code jp2015 cpuの話Code jp2015 cpuの話
Code jp2015 cpuの話
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
 
An Intelligent Storage?
An Intelligent Storage?An Intelligent Storage?
An Intelligent Storage?
 
20150630_MySQL勉強会
20150630_MySQL勉強会20150630_MySQL勉強会
20150630_MySQL勉強会
 
OpenStackを使用したGPU仮想化IaaS環境 事例紹介
OpenStackを使用したGPU仮想化IaaS環境 事例紹介OpenStackを使用したGPU仮想化IaaS環境 事例紹介
OpenStackを使用したGPU仮想化IaaS環境 事例紹介
 

Último

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 

Último (8)

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 

NVIDIA Japan Seminar 2012

  • 2. たったひとつでない、 GPUプログラミングの冴えたやり方 ready-to-useなライブラリを使う CUBLAS, CUFFT, CURAND, NPP, etc... ディレクティブ+半自動並列化コンパイラを使う PGI Fortran, OpenACC CUDAプログラミングする
  • 3. たったひとつでない、 GPUプログラミングの冴えたやり方 ready-to-useなライブラリを使う ✓ CUDAプログラミングのメリット CUBLAS, CUFFT, CURAND, NPP, etc... - 柔軟:GPUのロジックを自由に記述でき、細かい制御もできる - 高速:ロジックを命令レベルで最適化可能、データ転送のタイミングも自由 ディレクティブ+半自動並列化コンパイラを使う - 最新:GPUの最新のFeatureはまずCUDAに反映される PGI Fortran, OpenACC CUDAプログラミングしよう!
  • 5. CPU vs GPU CPU GPU ∼数十コア ∼数百コア 複雑なコントロール部 単純なコントロール部
  • 6. CUDAプログラミングモデル Host & Device CUDAアプリケーション CUDA CUDA API C Language 通信 CPU GPU
  • 7. CUDAプログラミングモデル Kernel → Thread → CUDA Core CUDAカーネルには 各スレッドの処理を記述 CUDAスレッド群は CUDAカーネルを実行 論理層 CUDAコアは 物理層 CUDAスレッドを順次実行 ∼数十万ものスレッドを数百のコアで効率良く実行
  • 8. CUDAプログラミングモデル Thread Hierarchy ✓ CUDAのスレッド空間は階層化されている Grid - 全体を構成するのが Grid Block - Grid の中に複数の Block Thread - Thread の中に複数の Thread ✓ なぜ? - どんな構成のGPUでも 同等スケールの性能を達成するため - 同期機構を提供しつつ、 スケーラビリティを担保できる
  • 9. CUDAプログラミング Basic Workflow CPU GPU 1.GPUメモリ確保 2.入力データ転送 3.カーネル呼び出し 4.カーネル実行 5.出力データ転送 6.GPUメモリ破棄
  • 10. CUDAプログラミング Basic CUDA API ✓ GPUメモリ確保/破棄 - cudaMalloc(void** devPtr, size_t size) - cudaFree(void* devPtr) ✓ データ転送 - cudaMemcpy(void* dst, void* src, size_t size, esize cudaMemcpyKind kind) ✓ カーネル呼び出し - kernel_function<<<grid_size, block_size>>>(...)
  • 11. CUDA プログラミング Basic CUDA C Language ✓ CUDA C Languageとは? - CUDAのカーネルを書くための言語 - 文法はほぼC/C++、ただし標準Cライブラリ等は使用できない ✓ 文法要素 - __global__ void func(...)でfuncがカーネルとしてコンパイルされる - __device__ void func(...)でfuncがデバイス関数 (カーネルから呼び出せる関数)としてコンパイルされる
  • 13. ----左から続く---- #include <iostream> #include <vector> // 2. 入力データ転送 // 4. カーネル実行 cudaMemcpy(d_a, &a[0], size*sizeof(float), cudaMemcpyHostToDevice); __global__ cudaMemcpy(d_b, &b[0], size*sizeof(float), void vecadd(float *a, float *b, float *c) cudaMemcpyHostToDevice); { c[threadIdx.x] = a[threadIdx.x] dim3 grid_size = dim3(1, 1, 1); + b[threadIdx.x]; dim3 block_size = dim3(size, 1, 1); } // 3. カーネル呼び出し int main(int argc, char *argv[]) { vecadd<<<grid_size, const int size = 16; block_size>>>(d_a, d_b, d_c); std::vector<float> a(size, 1); std::vector<float> b(size, 1); // 5. 出力データ転送 std::vector<float> c(size, 0); cudaMemcpy(&c[0], d_c, size*sizeof(float), cudaMemcpyDeviceToHost); float *d_a, *d_b, *d_c; // 6. GPUメモリ破棄 // 1. GPUメモリ確保 cudaFree(d_a); cudaMalloc(&d_a, size*sizeof(float)); cudaFree(d_b); cudaMalloc(&d_b, size*sizeof(float)); cudaFree(d_c); cudaMalloc(&d_c, size*sizeof(float)); for (int i=0; i<size; ++i) { ----右へ続く---- std::cout << c[i] << std::endl; }
  • 14. コンパイル&実行 ✓ コンパイル環境 - NVIDIA CUDA Driver、 NVIDIA CUDA Toolkitをインストール - CUDAコンパイラ nvccを使う - CUDAヘッダファイルのインクルードや必要なライブラリのリンクは 自動的にやってくれる ✓ 実行環境 - *nix環境:cudart.so/dylibへのパスを環境変数LD_LIBRARY_PATHに追加
  • 17. その時CUDAプログラマに 何が起こったか? ✓ プログラミングモデルが変わった - メモリ空間の統合によって メモリコピー操作が不要になった ✓ プログラミングの難易度が変わった - キャッシュによってメモリ局所性を 意識しなくてよくなった ✓ 最適化方法が変わった
  • 20. Unified Virtual Address Space ✓ Fermiアーキテクチャ+CUDA4.0ではCPUとGPUのメモリ空間が統合された これにより・・・ ✓ CPUとGPUのメモリ転送をプログラム中に書かなくて良くなった! ✓ 複数GPUを使用する際のメモリ転送をプログラム中に書かなくて良くなった! まさに いいことづくめ
  • 22. #include <iostream> __global__ void vecadd(float *a, float *b, float *c) { c[threadIdx.x] = a[threadIdx.x] + b[threadIdx.x]; } int main(int argc, char *argv[]) { const int size = 16; float *a, *b, *c; cudaMallocHost(&a, size*sizeof(float)); cudaMallocHost(&b, size*sizeof(float)); for (int i=0; i<size; ++i) { a[i] = b[i] = 1; c[i] = 0; } cudaMallocHost(&c, size*sizeof(float)); dim3 grid_size = dim3(1, 1, 1); dim3 block_size = dim3(size, 1, 1); vecadd<<<grid_size, block_size>>>(a, b, c); for (int i=0; i<size; ++i) std::cout << c[i] << std::endl; 注意:GT200アーキテクチャ すごく簡単
  • 23. でも、例えば・・・ CPU GPU Memory Kernel たくさん 明らかに遅い ループ
  • 24. こうするべき CPU GPU Memory Memory Kernel 明示的にDevice Memoryにキャッシュ
  • 25. アーキテクチャを知ることが なぜ重要か? ✓今時のCUDAはデータフローが隠 されていて 簡単にプログラミングできる Great! But... ✓遅いプログラムも簡単にかけてしまう
  • 28. Fermiアーキテクチャ Streaming Multiprocessor Streaming Multiprocessor CUDA Cores CUDA Cores L1 Cache Shared L1 Cache Shared Memory Memory L2 Cache L2 Cache Device Memory PCI Express
  • 29. I/O性能 ✓ PCI Express 低速 Streaming Multiprocessor Streaming Multiprocessor - レイテンシ:∼10us, スループット:∼8GB/s - CPU、チップセット、メインメモリ、PCIバスに性能が左右される CUDA Cores CUDA Cores ✓ Device Memory 中速 Shared Shared - GDDR5、オンボード/オフチップ L1 Cache Memory L1 Cache Memory - レイテンシ:∼500cycle, スループット:100~200GB/s L2 Cache L2 Cache ✓ L2 Cache 中高速 Device Memory (on board, off chip) - 768KB - レイテンシ:∼200cycle PCI Express I/O
  • 30. CacheとShared Memory ✓ 違い - L1/L2キャッシュによるキャッシュは暗黙的に行われる - Shared Memoryはカーネル中で明示的に使う ✓ Shared Memoryの使い方 - 変数修飾子__shared__をつける __global__ void kernel(float *ptr) { __shared__ float buf[16]; Shared Memoryの宣言とロード buf[16] = ptr[threadIdx.x]; ... __syncthreads(); 同期命令 ...
  • 32. 愚直な一手 __global__ void matmul_naive(float *a, float *b, float *c, int matrix_size) { const unsigned int xidx = blockIdx.x * blockDim.x + threadIdx.x; const unsigned int yidx = blockIdx.y * blockDim.y + threadIdx.y; float accumulator = 0.0; for (int i=0; i<matrix_size; ++i) { accumulator += a[yidx*matrix_size+i] * b[i*matrix_size+xidx]; } c[yidx*matrix_size+xidx] = accumulator; 1. 計算結果の行列Cの要素ごとに1スレッドを割り当てる - 16x16のスレッドからなる、(matrix_size/16)x(matrix_size/16)のブロッ ク 2. xidx, yidxは行列Cの要素の添字になる
  • 33. 2x2ブロックの4x4行列の計算に 単純化してみる A B C D × = A : & C : & B : & D : & ブロック内でデータを共有できれば 計算に必要な領域は少なくてすむ
  • 34. Shared Memoryでキャッシュ (Step1) 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 × 1.0 1.0 1.0 1.0 2.0 2.0 × 1.0 1.0 1.0 1.0 2.0 2.0 Shared Memory
  • 35. Shared Memoryでキャッシュ (Step2) 1.0 1.0 1.0 1.0 × 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 4.0 4.0 × 1.0 1.0 1.0 1.0 4.0 4.0 Shared Memory
  • 36. スマートな一手 __global__ void matmul_shared(float *a, float *b, float *c, int matrix_size) { const unsigned int xidx = blockIdx.x * blockDim.x + threadIdx.x; const unsigned int yidx = blockIdx.y * blockDim.y + threadIdx.y; float accumulator = 0.0; for (int i=0; i<matrix_size; i+=16) { Shared Memoryの宣言とロー __shared__ float sub_a[16][16]; __shared__ float sub_b[16][16]; sub_a[threadIdx.y][threadIdx.x] = a[yidx*matrix_size+(i+threadIdx.x)]; sub_b[threadIdx.y][threadIdx.x] = b[(i+threadIdx.y)*matrix_size+xidx]; Shared Memoryへの __syncthreads(); for (int j=0; j<16; ++j) { accumulator += sub_a[threadIdx.y][j] * sub_b[j][threadIdx.x]; } Shared Memoryからの __syncthreads(); }
  • 37. まとめ ✓CUDAプログラミングは簡単です - プログラミング言語的にはC + α程度、単純なプログラムなら 使用するAPIも10個以内ですむ - 「既存のCのコードをとりあえず動かだけ」すなら移植も楽 ✓最適化方法はアプリ(問題の性質)に依存する、 まずGPUアーキテクチャを理解しよう - メモリI/Oのコストは一見隠されてはいるものの、

Notas do Editor

  1. \n
  2. &amp;#x305D;&amp;#x308C;&amp;#x3067;&amp;#x306F;&amp;#x3001;&amp;#x672C;&amp;#x65E5;&amp;#x306E;&amp;#x30E1;&amp;#x30CB;&amp;#x30E5;&amp;#x30FC;&amp;#x3092;&amp;#x3054;&amp;#x7D39;&amp;#x4ECB;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\n&amp;#x524D;&amp;#x83DC;&amp;#x306F;&amp;#x3001;CUDA&amp;#x74B0;&amp;#x5883;&amp;#x69CB;&amp;#x7BC9;&amp;#x3067;&amp;#x3059;&amp;#x3002;CUDA&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;&amp;#x3092;&amp;#x884C;&amp;#x3046;&amp;#x306B;&amp;#x5F53;&amp;#x305F;&amp;#x3063;&amp;#x3066;&amp;#x3001;&amp;#x4F55;&amp;#x304C;&amp;#x5FC5;&amp;#x8981;&amp;#x306A;&amp;#x306E;&amp;#x304B;&amp;#x3092;&amp;#x7C21;&amp;#x5358;&amp;#x306B;&amp;#x3054;&amp;#x8AAC;&amp;#x660E;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;&amp;#x30E1;&amp;#x30A4;&amp;#x30F3;1&amp;#x76BF;&amp;#x76EE;&amp;#x306B;&amp;#x306F;&amp;#x3001;&amp;#x914D;&amp;#x5217;&amp;#x3092;xx&amp;#x3059;&amp;#x308B;&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30E0;&amp;#x3001;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x3082;&amp;#x306E;&amp;#x3092;&amp;#x30BC;&amp;#x30ED;&amp;#x304B;&amp;#x3089;&amp;#x5B9F;&amp;#x88C5;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;&amp;#x30E1;&amp;#x30A4;&amp;#x30F3;2&amp;#x76BF;&amp;#x76EE;&amp;#x306B;&amp;#x306F;&amp;#x3001;C++&amp;#x3067;&amp;#x5B9F;&amp;#x88C5;&amp;#x3055;&amp;#x308C;&amp;#x305F;&amp;#x30EA;&amp;#x30A2;&amp;#x30EB;&amp;#x30BF;&amp;#x30A4;&amp;#x30E0;&amp;#x30EC;&amp;#x30A4;&amp;#x30C8;&amp;#x30EC;&amp;#x30FC;&amp;#x30B7;&amp;#x30F3;&amp;#x30B0;&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30E0;&amp;#x3092;CUDA&amp;#x306B;&amp;#x79FB;&amp;#x690D;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;&amp;#x305D;&amp;#x3057;&amp;#x3066;&amp;#x30C7;&amp;#x30B6;&amp;#x30FC;&amp;#x30C8;&amp;#x306B;&amp;#x306F;&amp;#x3001;&amp;#x7C21;&amp;#x5358;&amp;#x306B;&amp;#x30D1;&amp;#x30D5;&amp;#x30A9;&amp;#x30FC;&amp;#x30DE;&amp;#x30F3;&amp;#x30B9;&amp;#x6E2C;&amp;#x5B9A;&amp;#x3092;&amp;#x884C;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n
  3. &amp;#x305D;&amp;#x308C;&amp;#x3067;&amp;#x306F;&amp;#x3001;&amp;#x672C;&amp;#x65E5;&amp;#x306E;&amp;#x30E1;&amp;#x30CB;&amp;#x30E5;&amp;#x30FC;&amp;#x3092;&amp;#x3054;&amp;#x7D39;&amp;#x4ECB;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\n&amp;#x524D;&amp;#x83DC;&amp;#x306F;&amp;#x3001;CUDA&amp;#x74B0;&amp;#x5883;&amp;#x69CB;&amp;#x7BC9;&amp;#x3067;&amp;#x3059;&amp;#x3002;CUDA&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;&amp;#x3092;&amp;#x884C;&amp;#x3046;&amp;#x306B;&amp;#x5F53;&amp;#x305F;&amp;#x3063;&amp;#x3066;&amp;#x3001;&amp;#x4F55;&amp;#x304C;&amp;#x5FC5;&amp;#x8981;&amp;#x306A;&amp;#x306E;&amp;#x304B;&amp;#x3092;&amp;#x7C21;&amp;#x5358;&amp;#x306B;&amp;#x3054;&amp;#x8AAC;&amp;#x660E;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;&amp;#x30E1;&amp;#x30A4;&amp;#x30F3;1&amp;#x76BF;&amp;#x76EE;&amp;#x306B;&amp;#x306F;&amp;#x3001;&amp;#x914D;&amp;#x5217;&amp;#x3092;xx&amp;#x3059;&amp;#x308B;&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30E0;&amp;#x3001;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x3082;&amp;#x306E;&amp;#x3092;&amp;#x30BC;&amp;#x30ED;&amp;#x304B;&amp;#x3089;&amp;#x5B9F;&amp;#x88C5;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;&amp;#x30E1;&amp;#x30A4;&amp;#x30F3;2&amp;#x76BF;&amp;#x76EE;&amp;#x306B;&amp;#x306F;&amp;#x3001;C++&amp;#x3067;&amp;#x5B9F;&amp;#x88C5;&amp;#x3055;&amp;#x308C;&amp;#x305F;&amp;#x30EA;&amp;#x30A2;&amp;#x30EB;&amp;#x30BF;&amp;#x30A4;&amp;#x30E0;&amp;#x30EC;&amp;#x30A4;&amp;#x30C8;&amp;#x30EC;&amp;#x30FC;&amp;#x30B7;&amp;#x30F3;&amp;#x30B0;&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30E0;&amp;#x3092;CUDA&amp;#x306B;&amp;#x79FB;&amp;#x690D;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;&amp;#x305D;&amp;#x3057;&amp;#x3066;&amp;#x30C7;&amp;#x30B6;&amp;#x30FC;&amp;#x30C8;&amp;#x306B;&amp;#x306F;&amp;#x3001;&amp;#x7C21;&amp;#x5358;&amp;#x306B;&amp;#x30D1;&amp;#x30D5;&amp;#x30A9;&amp;#x30FC;&amp;#x30DE;&amp;#x30F3;&amp;#x30B9;&amp;#x6E2C;&amp;#x5B9A;&amp;#x3092;&amp;#x884C;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n
  4. \n
  5. &amp;#x3055;&amp;#x3066;&amp;#x3001;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x3068;&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x8A00;&amp;#x8449;&amp;#x304C;&amp;#x51FA;&amp;#x3066;&amp;#x304D;&amp;#x307E;&amp;#x3057;&amp;#x305F;&amp;#x306D;&amp;#x3002;&amp;#x3053;&amp;#x308C;&amp;#x306B;&amp;#x3064;&amp;#x3044;&amp;#x3066;&amp;#x8AAC;&amp;#x660E;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\nGPU&amp;#x306F;&amp;#x3001;&amp;#x6570;&amp;#x4E07;&amp;#x3068;&amp;#x3044;&amp;#x3046;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x3092;&amp;#x6570;&amp;#x767E;&amp;#x306E;CUDA&amp;#x30B3;&amp;#x30A2;&amp;#x3067;&amp;#x4E26;&amp;#x5217;&amp;#x51E6;&amp;#x7406;&amp;#x3059;&amp;#x308B;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x5B9F;&amp;#x884C;&amp;#x30E2;&amp;#x30C7;&amp;#x30EB;&amp;#x3092;&amp;#x6301;&amp;#x3063;&amp;#x3066;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;CUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306F;&amp;#x3001;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x306E;&amp;#x51E6;&amp;#x7406;&amp;#x5185;&amp;#x5BB9;&amp;#x3092;&amp;#x8A18;&amp;#x8FF0;&amp;#x3059;&amp;#x308B;&amp;#x305F;&amp;#x3081;&amp;#x306E;&amp;#x3082;&amp;#x306E;&amp;#x3067;&amp;#x3001;__global__&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x8B58;&amp;#x5225;&amp;#x5B50;&amp;#x3092;&amp;#x95A2;&amp;#x6570;&amp;#x306E;&amp;#x5148;&amp;#x982D;&amp;#x306B;&amp;#x4ED8;&amp;#x3051;&amp;#x308B;&amp;#x3068;&amp;#x3001;&amp;#x305D;&amp;#x308C;&amp;#x304C;CUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306B;&amp;#x306A;&amp;#x308A;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\n= Live =\nCUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306E;&amp;#x30B9;&amp;#x30BF;&amp;#x30D6;&amp;#x3092;&amp;#x66F8;&amp;#x304F;\n
  6. &amp;#x3055;&amp;#x3066;&amp;#x3001;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x3068;&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x8A00;&amp;#x8449;&amp;#x304C;&amp;#x51FA;&amp;#x3066;&amp;#x304D;&amp;#x307E;&amp;#x3057;&amp;#x305F;&amp;#x306D;&amp;#x3002;&amp;#x3053;&amp;#x308C;&amp;#x306B;&amp;#x3064;&amp;#x3044;&amp;#x3066;&amp;#x8AAC;&amp;#x660E;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\nGPU&amp;#x306F;&amp;#x3001;&amp;#x6570;&amp;#x4E07;&amp;#x3068;&amp;#x3044;&amp;#x3046;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x3092;&amp;#x6570;&amp;#x767E;&amp;#x306E;CUDA&amp;#x30B3;&amp;#x30A2;&amp;#x3067;&amp;#x4E26;&amp;#x5217;&amp;#x51E6;&amp;#x7406;&amp;#x3059;&amp;#x308B;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x5B9F;&amp;#x884C;&amp;#x30E2;&amp;#x30C7;&amp;#x30EB;&amp;#x3092;&amp;#x6301;&amp;#x3063;&amp;#x3066;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;CUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306F;&amp;#x3001;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x306E;&amp;#x51E6;&amp;#x7406;&amp;#x5185;&amp;#x5BB9;&amp;#x3092;&amp;#x8A18;&amp;#x8FF0;&amp;#x3059;&amp;#x308B;&amp;#x305F;&amp;#x3081;&amp;#x306E;&amp;#x3082;&amp;#x306E;&amp;#x3067;&amp;#x3001;__global__&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x8B58;&amp;#x5225;&amp;#x5B50;&amp;#x3092;&amp;#x95A2;&amp;#x6570;&amp;#x306E;&amp;#x5148;&amp;#x982D;&amp;#x306B;&amp;#x4ED8;&amp;#x3051;&amp;#x308B;&amp;#x3068;&amp;#x3001;&amp;#x305D;&amp;#x308C;&amp;#x304C;CUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306B;&amp;#x306A;&amp;#x308A;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\n= Live =\nCUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306E;&amp;#x30B9;&amp;#x30BF;&amp;#x30D6;&amp;#x3092;&amp;#x66F8;&amp;#x304F;\n
  7. &amp;#x3055;&amp;#x3066;&amp;#x3001;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x3068;&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x8A00;&amp;#x8449;&amp;#x304C;&amp;#x51FA;&amp;#x3066;&amp;#x304D;&amp;#x307E;&amp;#x3057;&amp;#x305F;&amp;#x306D;&amp;#x3002;&amp;#x3053;&amp;#x308C;&amp;#x306B;&amp;#x3064;&amp;#x3044;&amp;#x3066;&amp;#x8AAC;&amp;#x660E;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\nGPU&amp;#x306F;&amp;#x3001;&amp;#x6570;&amp;#x4E07;&amp;#x3068;&amp;#x3044;&amp;#x3046;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x3092;&amp;#x6570;&amp;#x767E;&amp;#x306E;CUDA&amp;#x30B3;&amp;#x30A2;&amp;#x3067;&amp;#x4E26;&amp;#x5217;&amp;#x51E6;&amp;#x7406;&amp;#x3059;&amp;#x308B;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x5B9F;&amp;#x884C;&amp;#x30E2;&amp;#x30C7;&amp;#x30EB;&amp;#x3092;&amp;#x6301;&amp;#x3063;&amp;#x3066;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;CUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306F;&amp;#x3001;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x306E;&amp;#x51E6;&amp;#x7406;&amp;#x5185;&amp;#x5BB9;&amp;#x3092;&amp;#x8A18;&amp;#x8FF0;&amp;#x3059;&amp;#x308B;&amp;#x305F;&amp;#x3081;&amp;#x306E;&amp;#x3082;&amp;#x306E;&amp;#x3067;&amp;#x3001;__global__&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x8B58;&amp;#x5225;&amp;#x5B50;&amp;#x3092;&amp;#x95A2;&amp;#x6570;&amp;#x306E;&amp;#x5148;&amp;#x982D;&amp;#x306B;&amp;#x4ED8;&amp;#x3051;&amp;#x308B;&amp;#x3068;&amp;#x3001;&amp;#x305D;&amp;#x308C;&amp;#x304C;CUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306B;&amp;#x306A;&amp;#x308A;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\n= Live =\nCUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306E;&amp;#x30B9;&amp;#x30BF;&amp;#x30D6;&amp;#x3092;&amp;#x66F8;&amp;#x304F;\n
  8. &amp;#x3055;&amp;#x3066;&amp;#x3001;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x3068;&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x8A00;&amp;#x8449;&amp;#x304C;&amp;#x51FA;&amp;#x3066;&amp;#x304D;&amp;#x307E;&amp;#x3057;&amp;#x305F;&amp;#x306D;&amp;#x3002;&amp;#x3053;&amp;#x308C;&amp;#x306B;&amp;#x3064;&amp;#x3044;&amp;#x3066;&amp;#x8AAC;&amp;#x660E;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\nGPU&amp;#x306F;&amp;#x3001;&amp;#x6570;&amp;#x4E07;&amp;#x3068;&amp;#x3044;&amp;#x3046;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x3092;&amp;#x6570;&amp;#x767E;&amp;#x306E;CUDA&amp;#x30B3;&amp;#x30A2;&amp;#x3067;&amp;#x4E26;&amp;#x5217;&amp;#x51E6;&amp;#x7406;&amp;#x3059;&amp;#x308B;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x5B9F;&amp;#x884C;&amp;#x30E2;&amp;#x30C7;&amp;#x30EB;&amp;#x3092;&amp;#x6301;&amp;#x3063;&amp;#x3066;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;CUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306F;&amp;#x3001;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x306E;&amp;#x51E6;&amp;#x7406;&amp;#x5185;&amp;#x5BB9;&amp;#x3092;&amp;#x8A18;&amp;#x8FF0;&amp;#x3059;&amp;#x308B;&amp;#x305F;&amp;#x3081;&amp;#x306E;&amp;#x3082;&amp;#x306E;&amp;#x3067;&amp;#x3001;__global__&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x8B58;&amp;#x5225;&amp;#x5B50;&amp;#x3092;&amp;#x95A2;&amp;#x6570;&amp;#x306E;&amp;#x5148;&amp;#x982D;&amp;#x306B;&amp;#x4ED8;&amp;#x3051;&amp;#x308B;&amp;#x3068;&amp;#x3001;&amp;#x305D;&amp;#x308C;&amp;#x304C;CUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306B;&amp;#x306A;&amp;#x308A;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\n= Live =\nCUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306E;&amp;#x30B9;&amp;#x30BF;&amp;#x30D6;&amp;#x3092;&amp;#x66F8;&amp;#x304F;\n
  9. &amp;#x3055;&amp;#x3066;&amp;#x3001;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x3068;&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x8A00;&amp;#x8449;&amp;#x304C;&amp;#x51FA;&amp;#x3066;&amp;#x304D;&amp;#x307E;&amp;#x3057;&amp;#x305F;&amp;#x306D;&amp;#x3002;&amp;#x3053;&amp;#x308C;&amp;#x306B;&amp;#x3064;&amp;#x3044;&amp;#x3066;&amp;#x8AAC;&amp;#x660E;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\nGPU&amp;#x306F;&amp;#x3001;&amp;#x6570;&amp;#x4E07;&amp;#x3068;&amp;#x3044;&amp;#x3046;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x3092;&amp;#x6570;&amp;#x767E;&amp;#x306E;CUDA&amp;#x30B3;&amp;#x30A2;&amp;#x3067;&amp;#x4E26;&amp;#x5217;&amp;#x51E6;&amp;#x7406;&amp;#x3059;&amp;#x308B;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x5B9F;&amp;#x884C;&amp;#x30E2;&amp;#x30C7;&amp;#x30EB;&amp;#x3092;&amp;#x6301;&amp;#x3063;&amp;#x3066;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;CUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306F;&amp;#x3001;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x306E;&amp;#x51E6;&amp;#x7406;&amp;#x5185;&amp;#x5BB9;&amp;#x3092;&amp;#x8A18;&amp;#x8FF0;&amp;#x3059;&amp;#x308B;&amp;#x305F;&amp;#x3081;&amp;#x306E;&amp;#x3082;&amp;#x306E;&amp;#x3067;&amp;#x3001;__global__&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x8B58;&amp;#x5225;&amp;#x5B50;&amp;#x3092;&amp;#x95A2;&amp;#x6570;&amp;#x306E;&amp;#x5148;&amp;#x982D;&amp;#x306B;&amp;#x4ED8;&amp;#x3051;&amp;#x308B;&amp;#x3068;&amp;#x3001;&amp;#x305D;&amp;#x308C;&amp;#x304C;CUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306B;&amp;#x306A;&amp;#x308A;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\n= Live =\nCUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306E;&amp;#x30B9;&amp;#x30BF;&amp;#x30D6;&amp;#x3092;&amp;#x66F8;&amp;#x304F;\n
  10. &amp;#x3055;&amp;#x3066;&amp;#x3001;CUDA API&amp;#x3068;CUDA&amp;#x306E;&amp;#x62E1;&amp;#x5F35;&amp;#x69CB;&amp;#x6587;&amp;#x306B;&amp;#x3064;&amp;#x3044;&amp;#x3066;&amp;#x3067;&amp;#x3059;&amp;#x304C;&amp;#x3001;&amp;#x5FC5;&amp;#x8981;&amp;#x306A;&amp;#x306E;&amp;#x306F;&amp;#x5168;&amp;#x90E8;&amp;#x3067;&amp;#x305F;&amp;#x3063;&amp;#x305F;&amp;#xFF14;&amp;#x3064;&amp;#x3067;&amp;#x3059;&amp;#x3002;\nGPU&amp;#x306F;&amp;#x5C02;&amp;#x7528;&amp;#x306E;&amp;#x30E1;&amp;#x30E2;&amp;#x30EA;&amp;#x7A7A;&amp;#x9593;&amp;#x3092;&amp;#x6301;&amp;#x3063;&amp;#x3066;&amp;#x304A;&amp;#x308A;&amp;#x3001;&amp;#x3053;&amp;#x306E;&amp;#x30E1;&amp;#x30E2;&amp;#x30EA;&amp;#x7A7A;&amp;#x9593;&amp;#x306E;&amp;#x30A2;&amp;#x30ED;&amp;#x30B1;&amp;#x30FC;&amp;#x30B7;&amp;#x30E7;&amp;#x30F3;&amp;#x306B;&amp;#x4F7F;&amp;#x7528;&amp;#x3059;&amp;#x308B;&amp;#x306E;&amp;#x304C;cudaMalloc&amp;#x3068;cudaFree&amp;#x3067;&amp;#x3059;&amp;#x3002;\n&amp;#x307E;&amp;#x305F;&amp;#x3001;CPU&amp;#x5074;&amp;#x306E;&amp;#x30E1;&amp;#x30E2;&amp;#x30EA;&amp;#x3068;&amp;#x306E;&amp;#x9593;&amp;#x306E;&amp;#x30C7;&amp;#x30FC;&amp;#x30BF;&amp;#x306E;&amp;#x30B3;&amp;#x30D4;&amp;#x30FC;&amp;#x306F;cudaMemcpy&amp;#x3068;&amp;#x3044;&amp;#x3046;API&amp;#x3092;&amp;#x4F7F;&amp;#x7528;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\n&amp;#x305D;&amp;#x3057;&amp;#x3066;&amp;#x3001;&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x3068;&amp;#x547C;&amp;#x3070;&amp;#x308C;&amp;#x308B;GPU&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30E0;&amp;#x306E;&amp;#x547C;&amp;#x3073;&amp;#x51FA;&amp;#x3057;&amp;#x306B;&amp;#x306F;&amp;#x3001;CUDA&amp;#x306E;&amp;#x62E1;&amp;#x5F35;&amp;#x6587;&amp;#x6CD5;&amp;#x3092;&amp;#x4F7F;&amp;#x7528;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n&amp;#x3053;&amp;#x306E;&amp;#x3088;&amp;#x3046;&amp;#x306B;&amp;#x30A2;&amp;#x30F3;&amp;#x30B0;&amp;#x30EB;&amp;#x30D6;&amp;#x30E9;&amp;#x30B1;&amp;#x30C3;&amp;#x30C8;&amp;#x3092;&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x95A2;&amp;#x6570;&amp;#x306E;&amp;#x524D;&amp;#x306B;&amp;#x4ED8;&amp;#x3051;&amp;#x3001;nvcc&amp;#x3067;&amp;#x30B3;&amp;#x30F3;&amp;#x30D1;&amp;#x30A4;&amp;#x30EB;&amp;#x3059;&amp;#x308B;&amp;#x3068;&amp;#x3001;\n&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x306E;&amp;#x547C;&amp;#x3073;&amp;#x51FA;&amp;#x3057;&amp;#x3068;&amp;#x3057;&amp;#x3066;&amp;#x89E3;&amp;#x91C8;&amp;#x3055;&amp;#x308C;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\n= Live =\nCUDA API&amp;#x3092;&amp;#x4F7F;&amp;#x7528;&amp;#x3057;&amp;#x305F;&amp;#x30DB;&amp;#x30B9;&amp;#x30C8;&amp;#x30B3;&amp;#x30FC;&amp;#x30C9;&amp;#x3092;&amp;#x4F5C;&amp;#x6210;&amp;#x3059;&amp;#x308B;\n
  11. CUDA&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x5185;&amp;#x90E8;&amp;#x3067;&amp;#x306F;&amp;#x3001;&amp;#x3044;&amp;#x304F;&amp;#x3064;&amp;#x304B;&amp;#x306E;&amp;#x7279;&amp;#x6B8A;&amp;#x306A;&amp;#x7D44;&amp;#x307F;&amp;#x8FBC;&amp;#x307F;&amp;#x95A2;&amp;#x6570;&amp;#x3084;&amp;#x5909;&amp;#x6570;&amp;#x304C;&amp;#x4F7F;&amp;#x7528;&amp;#x3067;&amp;#x304D;&amp;#x307E;&amp;#x3059;&amp;#x3002;&amp;#x4ECA;&amp;#x56DE;&amp;#x306F;&amp;#x3001;threadIdx&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x7D44;&amp;#x307F;&amp;#x8FBC;&amp;#x307F;&amp;#x5909;&amp;#x6570;&amp;#x306E;&amp;#x307F;&amp;#x3092;&amp;#x4F7F;&amp;#x7528;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;&amp;#x3053;&amp;#x306E;&amp;#x5909;&amp;#x6570;&amp;#x306F;&amp;#x3001;&amp;#x305D;&amp;#x306E;&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x3092;&amp;#x5B9F;&amp;#x884C;&amp;#x3059;&amp;#x308B;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x306E;ID&amp;#x3092;&amp;#x683C;&amp;#x7D0D;&amp;#x3057;&amp;#x3066;&amp;#x304A;&amp;#x308A;&amp;#x3001;CUDA&amp;#x30B9;&amp;#x30EC;&amp;#x30C3;&amp;#x30C9;&amp;#x3054;&amp;#x3068;&amp;#x306B;&amp;#x9055;&amp;#x3046;&amp;#x5909;&amp;#x6570;&amp;#x3092;&amp;#x53D6;&amp;#x5F97;&amp;#x3067;&amp;#x304D;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n\n= Live =\n&amp;#x30AB;&amp;#x30FC;&amp;#x30CD;&amp;#x30EB;&amp;#x3092;&amp;#x5B9F;&amp;#x88C5;\n&amp;#x95A2;&amp;#x6570;&amp;#x30AA;&amp;#x30D6;&amp;#x30B8;&amp;#x30A7;&amp;#x30AF;&amp;#x30C8;&amp;#x3092;&amp;#x5B9F;&amp;#x88C5;&amp;#x3057;&amp;#x3001;&amp;#x95A2;&amp;#x6570;&amp;#x306B;__device__&amp;#x8B58;&amp;#x5225;&amp;#x5B50;&amp;#x3092;&amp;#x4ED8;&amp;#x3051;&amp;#x308B;\n
  12. &amp;#x3055;&amp;#x3066;&amp;#x3001;&amp;#x3053;&amp;#x308C;&amp;#x3067;CUDA&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;&amp;#x74B0;&amp;#x5883;&amp;#x306F;&amp;#x6574;&amp;#x3044;&amp;#x307E;&amp;#x3057;&amp;#x305F;&amp;#x3002;&amp;#x6B21;&amp;#x306F;&amp;#x3044;&amp;#x3088;&amp;#x3044;&amp;#x3088;&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;&amp;#x306E;&amp;#x6642;&amp;#x9593;&amp;#x3067;&amp;#x3059;&amp;#x3002;\n
  13. &amp;#x3055;&amp;#x3066;&amp;#x3001;&amp;#x3053;&amp;#x308C;&amp;#x3067;CUDA&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;&amp;#x74B0;&amp;#x5883;&amp;#x306F;&amp;#x6574;&amp;#x3044;&amp;#x307E;&amp;#x3057;&amp;#x305F;&amp;#x3002;&amp;#x6B21;&amp;#x306F;&amp;#x3044;&amp;#x3088;&amp;#x3044;&amp;#x3088;&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;&amp;#x306E;&amp;#x6642;&amp;#x9593;&amp;#x3067;&amp;#x3059;&amp;#x3002;\n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. &amp;#x3055;&amp;#x3066;&amp;#x3001;&amp;#x3053;&amp;#x308C;&amp;#x3067;CUDA&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;&amp;#x74B0;&amp;#x5883;&amp;#x306F;&amp;#x6574;&amp;#x3044;&amp;#x307E;&amp;#x3057;&amp;#x305F;&amp;#x3002;&amp;#x6B21;&amp;#x306F;&amp;#x3044;&amp;#x3088;&amp;#x3044;&amp;#x3088;&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;&amp;#x306E;&amp;#x6642;&amp;#x9593;&amp;#x3067;&amp;#x3059;&amp;#x3002;\n
  22. &amp;#x3055;&amp;#x3066;&amp;#x3001;&amp;#x3053;&amp;#x308C;&amp;#x3067;CUDA&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;&amp;#x74B0;&amp;#x5883;&amp;#x306F;&amp;#x6574;&amp;#x3044;&amp;#x307E;&amp;#x3057;&amp;#x305F;&amp;#x3002;&amp;#x6B21;&amp;#x306F;&amp;#x3044;&amp;#x3088;&amp;#x3044;&amp;#x3088;&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;&amp;#x306E;&amp;#x6642;&amp;#x9593;&amp;#x3067;&amp;#x3059;&amp;#x3002;\n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. &amp;#x305D;&amp;#x308C;&amp;#x3067;&amp;#x306F;&amp;#x3001;&amp;#x30E1;&amp;#x30A4;&amp;#x30F3;&amp;#xFF12;&amp;#x76BF;&amp;#x76EE;&amp;#x3001;&amp;#x30EA;&amp;#x30A2;&amp;#x30EB;&amp;#x30BF;&amp;#x30A4;&amp;#x30E0;&amp;#x30EC;&amp;#x30A4;&amp;#x30C8;&amp;#x30EC;&amp;#x30FC;&amp;#x30B7;&amp;#x30F3;&amp;#x30B0;&amp;#x306B;&amp;#x3064;&amp;#x3044;&amp;#x3066;&amp;#x3002;\n\n
  32. &amp;#x3055;&amp;#x3066;&amp;#x3001;&amp;#x3053;&amp;#x308C;&amp;#x3067;CUDA&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;&amp;#x74B0;&amp;#x5883;&amp;#x306F;&amp;#x6574;&amp;#x3044;&amp;#x307E;&amp;#x3057;&amp;#x305F;&amp;#x3002;&amp;#x6B21;&amp;#x306F;&amp;#x3044;&amp;#x3088;&amp;#x3044;&amp;#x3088;&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;&amp;#x306E;&amp;#x6642;&amp;#x9593;&amp;#x3067;&amp;#x3059;&amp;#x3002;\n
  33. \n
  34. \n
  35. \n
  36. &amp;#x3055;&amp;#x3066;&amp;#x3001;&amp;#x3053;&amp;#x308C;&amp;#x3067;CUDA&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;&amp;#x74B0;&amp;#x5883;&amp;#x306F;&amp;#x6574;&amp;#x3044;&amp;#x307E;&amp;#x3057;&amp;#x305F;&amp;#x3002;&amp;#x6B21;&amp;#x306F;&amp;#x3044;&amp;#x3088;&amp;#x3044;&amp;#x3088;&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;&amp;#x306E;&amp;#x6642;&amp;#x9593;&amp;#x3067;&amp;#x3059;&amp;#x3002;\n
  37. \n
  38. &amp;#x305D;&amp;#x308C;&amp;#x3067;&amp;#x306F;&amp;#x307F;&amp;#x306A;&amp;#x3055;&amp;#x3093;&amp;#x3001;&amp;#x3088;&amp;#x3044;&amp;#x30D7;&amp;#x30ED;&amp;#x30B0;&amp;#x30E9;&amp;#x30DF;&amp;#x30F3;&amp;#x30B0;&amp;#x3092;&amp;#xFF01;\n