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 !

NVIDIA Japan Seminar 2012

  • 1.
  • 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プログラミングしよう!
  • 4.
  • 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がデバイス関数 (カーネルから呼び出せる関数)としてコンパイルされる
  • 12.
  • 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に追加
  • 15.
  • 16.
  • 17.
    その時CUDAプログラマに 何が起こったか? ✓ プログラミングモデルが変わった - メモリ空間の統合によって メモリコピー操作が不要になった ✓ プログラミングの難易度が変わった - キャッシュによってメモリ局所性を 意識しなくてよくなった ✓ 最適化方法が変わった
  • 18.
  • 19.
  • 20.
    Unified Virtual AddressSpace ✓ Fermiアーキテクチャ+CUDA4.0ではCPUとGPUのメモリ空間が統合された これにより・・・ ✓ CPUとGPUのメモリ転送をプログラム中に書かなくて良くなった! ✓ 複数GPUを使用する際のメモリ転送をプログラム中に書かなくて良くなった! まさに いいことづくめ
  • 21.
  • 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... ✓遅いプログラムも簡単にかけてしまう
  • 26.
  • 27.
  • 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(); 同期命令 ...
  • 31.
  • 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のコストは一見隠されてはいるものの、
  • 38.

Editor's Notes

  • #2 \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 &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
  • #5 \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&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
  • #11 &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
  • #12 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
  • #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 &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
  • #15 \n
  • #16 \n
  • #17 \n
  • #18 \n
  • #19 \n
  • #20 \n
  • #21 \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 &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
  • #24 \n
  • #25 \n
  • #26 \n
  • #27 \n
  • #28 \n
  • #29 \n
  • #30 \n
  • #31 \n
  • #32 &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
  • #33 &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
  • #34 \n
  • #35 \n
  • #36 \n
  • #37 &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
  • #38 \n
  • #39 &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