SlideShare a Scribd company logo
1 of 89
CUDAを利用したPIV解析の
   高速化に関する研究



指導教員       熱工学研究室
二宮 尚         史 翔新
CUDAを利用したPIV解析の
   高速化に関する研究



指導教員       熱工学研究室
二宮 尚         史 翔新
PIV
Particle Image Velocimetry
      粒子画像流速測定法
時刻 t   時刻 t+Δt
時刻t
時刻t
時刻t   時刻t+Δt
時刻t   時刻t+Δt
時刻t   時刻t+Δt
時刻t   時刻t+Δt
時刻t   時刻t+Δt
時刻t   時刻t+Δt
時刻t
PIV解析はベクトルが多い
PIV解析はベクトルが多い

• 画像サイズは1024×1024
PIV解析はベクトルが多い

• 画像サイズは1024×1024
• 検査領域サイズは8×8から48×48
PIV解析はベクトルが多い

• 画像サイズは1024×1024
• 検査領域サイズは8×8から48×48
• オーバーラップは50%が平均的
PIV解析はベクトルが多い


 一回の解析で数千∼数万のベクトル
同時演算
同時演算に優れたデバイス?
GPU
Graphics Processing Unit
     画像演算装置
GPU
Graphics Processing Unit
 画像演算装置
GPGPU
General Purpose Graphics Processing Unit
         汎用目的画像演算装置
SM数       SP数
   名前
              (CPU数相当) (コア数相当)
GeForce GT
                 12        96
   240
GeForce GTX
                 48        384
   560 Ti
GeForce GTX
                168       1,344
   660 Ti

                  主流のグラフィックボードスペック
スパコン   単一CPU   単一GPU

 演算能力      ◎      ⃝       △

単一スレッド
           ◎      ◎       ⃝
 演算速度

マルチスレッド
           ◎      △       ⃝
  演算速度

運用コスト      ☓      ⃝       ⃝
スパコン   単一CPU   単一GPU

 演算能力      ◎      ⃝       △

単一スレッド
           ◎      ◎       ⃝
 演算速度

マルチスレッド
           ◎      △       ⃝
  演算速度

運用コスト      ☓      ⃝       ⃝
スパコン   単一CPU   単一GPU

 演算能力      ◎      ⃝       △

単一スレッド
           ◎      ◎       ⃝
 演算速度

マルチスレッド
           ◎      △       ⃝
  演算速度

運用コスト      ☓      ⃝       ⃝
GPGPU
CPU
GPGPU
CPU   C、Java、Ruby…
GPGPU
CPU   C、Java、Ruby…
GPGPU   言語?
• CUDA
• CUDA
• ATI Stream
• CUDA
• ATI Stream
• OpenCL
CUDA   ATI Stream   OpenCL

対応デバイス    △         △          ⃝

 性能       ◎         ◎          ⃝

サポート      ◎         △          ⃝
CUDA   ATI Stream   OpenCL

対応デバイス    △         △          ⃝

 性能       ◎         ◎          ⃝

サポート      ◎         △          ⃝
CUDA   ATI Stream   OpenCL

対応デバイス    △         △          ⃝

 性能       ◎         ◎          ⃝

サポート      ◎         △          ⃝
CUDA   ATI Stream   OpenCL

対応デバイス    △         △          ⃝

 性能       ◎         ◎          ⃝

サポート      ◎         △          ⃝
CUDA   ATI Stream   OpenCL

対応デバイス    △         △          ⃝

 性能       ◎         ◎          ⃝

サポート      ◎         △          ⃝
CUDA
C言語コード   CUDAコード
C言語コード                  CUDAコード
#include <stdio.h>

int main() {
! int n, *a;
! n = 100;
! a = (int *)malloc(n);

!
!   func(a, n);


!
!   return 0;
}

void func(int *a, int n) {
! int i;



!   for (i = 0; i < n; i++) {
!   ! a[i] = i;
!   }
}
C言語コード                         CUDAコード
#include <stdio.h>              #include <stdio.h>

int main() {                    int main() {
! int n, *a;                    ! int n, *cpu_a, *gpu_a;
! n = 100;                      ! n = 100;
! a = (int *)malloc(n);         ! cpu_a = (int *)malloc(n);
                                ! cudaMalloc((void **)&gpu_a, n);
!                               !
!   func(a, n);                 ! func<<<3, 32>>>(gpu_a, n);
                                ! cudaMemcpy(cpu_a, gpu_a, n,
                                cudaMemcpyDeviceToHost);
!                               !
!   return 0;                   ! return 0;
}                               }

void func(int *a, int n) {      __global__ void func(int *a, int n) {
! int i;                        ! int i;
                                ! i = blockIdx.x * blockDim.x +
                                threadIdx.x;
                                !
!   for (i = 0; i < n; i++) {   ! if (i < n) {
!   ! a[i] = i;                 ! ! a[i] = i;
!   }                           ! }
}                               }
C言語コード                         CUDAコード
#include <stdio.h>              #include <stdio.h>

int main() {                    int main() {
! int n, *a;                    ! int n, *cpu_a, *gpu_a;
! n = 100;                      ! n = 100;
! a = (int *)malloc(n);         ! cpu_a = (int *)malloc(n);
                                ! cudaMalloc((void **)&gpu_a, n);
!                               !
!   func(a, n);                 ! func<<<3, 32>>>(gpu_a, n);
                                ! cudaMemcpy(cpu_a, gpu_a, n,
                                cudaMemcpyDeviceToHost);
!                               !
!   return 0;                   ! return 0;
}                               }

void func(int *a, int n) {      __global__ void func(int *a, int n) {
! int i;                        ! int i;
                                ! i = blockIdx.x * blockDim.x +
                                threadIdx.x;
                                !
!   for (i = 0; i < n; i++) {   ! if (i < n) {
!   ! a[i] = i;                 ! ! a[i] = i;
!   }                           ! }
}                               }
C言語コード                         CUDAコード
#include <stdio.h>              #include <stdio.h>

int main() {                    int main() {
! int n, *a;                    ! int n, *cpu_a, *gpu_a;
! n = 100;                      ! n = 100;
! a = (int *)malloc(n);         ! cpu_a = (int *)malloc(n);
                                ! cudaMalloc((void **)&gpu_a, n);
!                               !
!   func(a, n);                 ! func<<<3, 32>>>(gpu_a, n);
                                ! cudaMemcpy(cpu_a, gpu_a, n,
                                cudaMemcpyDeviceToHost);
!                               !
!   return 0;                   ! return 0;
}                               }

void func(int *a, int n) {      __global__ void func(int *a, int n) {
! int i;                        ! int i;
                                ! i = blockIdx.x * blockDim.x +
                                threadIdx.x;
                                !
!   for (i = 0; i < n; i++) {   ! if (i < n) {
!   ! a[i] = i;                 ! ! a[i] = i;
!   }                           ! }
}                               }
C言語コード                         CUDAコード
#include <stdio.h>              #include <stdio.h>

int main() {                    int main() {
! int n, *a;                    ! int n, *cpu_a, *gpu_a;
! n = 100;                      ! n = 100;
! a = (int *)malloc(n);         ! cpu_a = (int *)malloc(n);
                                ! cudaMalloc((void **)&gpu_a, n);
!                               !
!   func(a, n);                 ! func<<<3, 32>>>(gpu_a, n);
                                ! cudaMemcpy(cpu_a, gpu_a, n,
                                cudaMemcpyDeviceToHost);
!                               !
!   return 0;                   ! return 0;
}                               }

void func(int *a, int n) {      __global__ void func(int *a, int n) {
! int i;                        ! int i;
                                ! i = blockIdx.x * blockDim.x +
                                threadIdx.x;
                                !
!   for (i = 0; i < n; i++) {   ! if (i < n) {
!   ! a[i] = i;                 ! ! a[i] = i;
!   }                           ! }
}                               }
C言語コード                         CUDAコード
#include <stdio.h>              #include <stdio.h>

int main() {                    int main() {
! int n, *a;                    ! int n, *cpu_a, *gpu_a;
! n = 100;                      ! n = 100;
! a = (int *)malloc(n);         ! cpu_a = (int *)malloc(n);
                                ! cudaMalloc((void **)&gpu_a, n);
!                               !
!   func(a, n);                 ! func<<<3, 32>>>(gpu_a, n);
                                ! cudaMemcpy(cpu_a, gpu_a, n,
                                cudaMemcpyDeviceToHost);
!                               !
!   return 0;                   ! return 0;
}                               }

void func(int *a, int n) {      __global__ void func(int *a, int n) {
! int i;                        ! int i;
                                ! i = blockIdx.x * blockDim.x +
                                threadIdx.x;
                                !
!   for (i = 0; i < n; i++) {   ! if (i < n) {
!   ! a[i] = i;                 ! ! a[i] = i;
!   }                           ! }
}                               }
C言語コード                         CUDAコード
#include <stdio.h>              #include <stdio.h>

int main() {                    int main() {
! int n, *a;                    ! int n, *cpu_a, *gpu_a;
! n = 100;                      ! n = 100;
! a = (int *)malloc(n);         ! cpu_a = (int *)malloc(n);
                                ! cudaMalloc((void **)&gpu_a, n);
!                               !
!   func(a, n);                 ! func<<<3, 32>>>(gpu_a, n);
                                ! cudaMemcpy(cpu_a, gpu_a, n,
                                cudaMemcpyDeviceToHost);
!                               !
!   return 0;                   ! return 0;
}                               }

void func(int *a, int n) {      __global__ void func(int *a, int n) {
! int i;                        ! int i;
                                ! i = blockIdx.x * blockDim.x +
                                threadIdx.x;
                                !
!   for (i = 0; i < n; i++) {   ! if (i < n) {
!   ! a[i] = i;                 ! ! a[i] = i;
!   }                           ! }
}                               }
C言語コード                         CUDAコード
#include <stdio.h>              #include <stdio.h>

int main() {                    int main() {
! int n, *a;                    ! int n, *cpu_a, *gpu_a;
! n = 100;                      ! n = 100;
! a = (int *)malloc(n);         ! cpu_a = (int *)malloc(n);
                                ! cudaMalloc((void **)&gpu_a, n);
!                               !
!   func(a, n);                 ! func<<<3, 32>>>(gpu_a, n);
                                ! cudaMemcpy(cpu_a, gpu_a, n,
                                cudaMemcpyDeviceToHost);
!                               !
!   return 0;                   ! return 0;
}                               }

void func(int *a, int n) {      __global__ void func(int *a, int n) {
! int i;                        ! int i;
                                ! i = blockIdx.x * blockDim.x +
                                threadIdx.x;
                                !
!   for (i = 0; i < n; i++) {   ! if (i < n) {
!   ! a[i] = i;                 ! ! a[i] = i;
!   }                           ! }
}                               }
C言語コード                         CUDAコード
#include <stdio.h>              #include <stdio.h>

int main() {                    int main() {
! int n, *a;                    ! int n, *cpu_a, *gpu_a;
! n = 100;                      ! n = 100;
! a = (int *)malloc(n);         ! cpu_a = (int *)malloc(n);
                                ! cudaMalloc((void **)&gpu_a, n);
!                               !
!   func(a, n);                 ! func<<<3, 32>>>(gpu_a, n);
                                ! cudaMemcpy(cpu_a, gpu_a, n,
                                cudaMemcpyDeviceToHost);
!                               !
!   return 0;                   ! return 0;
}                               }

void func(int *a, int n) {      __global__ void func(int *a, int n) {
! int i;                        ! int i;
                                ! i = blockIdx.x * blockDim.x +
                                threadIdx.x;
                                !
!   for (i = 0; i < n; i++) {   ! if (i < n) {
!   ! a[i] = i;                 ! ! a[i] = i;
!   }                           ! }
}                               }
PIV解析実行時間比較
90 sec




60 sec




30 sec




                  i:24; w: 24   i:32; w:32   i:48; w:48
   i: 16; w: 16
PIV解析実行時間比較
90 sec                          C言語(Intel Core 2 Duo P8400 2.26GHz)



60 sec




30 sec




                  i:24; w: 24   i:32; w:32    i:48; w:48
   i: 16; w: 16
PIV解析実行時間比較
90 sec                          C言語(Intel Core 2 Duo P8400 2.26GHz)



60 sec




30 sec                                C言語(Intel Core i5 2400s 2.5GHz)




                  i:24; w: 24   i:32; w:32     i:48; w:48
   i: 16; w: 16
PIV解析実行時間比較
90 sec                          C言語(Intel Core 2 Duo P8400 2.26GHz)



60 sec




30 sec                                C言語(Intel Core i5 2400s 2.5GHz)



                                     CUDA(Nvidia GeForce GTX 560 Ti)

                  i:24; w: 24   i:32; w:32     i:48; w:48
   i: 16; w: 16
倍以上の速さ

         ※Core i5の実行速度より
3
倍以上の速さ

         ※Core i5の実行速度より
3
倍以上の速さ

         ※Core i5の実行速度より
                ※最適化無し
300
倍以上の速さ

         ※Core i5の実行速度より
         ※最適化した場合の予想値
CUDAを用いた場合のPIV解析時間
  0 sec   10 sec   20 sec   30 sec   40 sec   50 sec


2枚




30枚


           現在値                  予想値




                    ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
CUDAを用いた場合のPIV解析時間
  0 sec         10 sec   20 sec   30 sec   40 sec   50 sec

          2.75 sec
2枚




30枚


                 現在値                  予想値




                          ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
CUDAを用いた場合のPIV解析時間
  0 sec          10 sec   20 sec   30 sec   40 sec   50 sec

          2.75 sec
2枚
      0.03 sec




30枚


                  現在値                  予想値




                           ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
CUDAを用いた場合のPIV解析時間
  0 sec          10 sec   20 sec   30 sec   40 sec      50 sec

          2.75 sec
2枚
      0.03 sec


                                                     41.25 sec

30枚


                  現在値                  予想値




                           ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
CUDAを用いた場合のPIV解析時間
  0 sec           10 sec   20 sec   30 sec   40 sec      50 sec

          2.75 sec
2枚
      0.03 sec


                                                      41.25 sec

30枚
       0.41 sec

                   現在値                  予想値




                            ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
CUDAを用いた場合のPIV解析時間
  0 sec           10 sec   20 sec   30 sec   40 sec      50 sec

          2.75 sec
2枚
      0.03 sec


                                                      41.25 sec

30枚
       0.41 sec

                   現在値                  予想値


        30枚を処理するのに1秒以下

                            ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
フレームレートより


速い解析スピード
リアルタイムレンダリング
解析スタイルを
大きく変える

リアルタイムレンダリング
今後の課題
今後の課題

• PIV(OCC)プログラムの改良
今後の課題

• PIV(OCC)プログラムの改良
• リアルタイムレンダリング(理想)
!ank y"

More Related Content

What's hot

Webシステムプログラミング設計書2015
Webシステムプログラミング設計書2015Webシステムプログラミング設計書2015
Webシステムプログラミング設計書2015義広 河野
 
Natriuretic peptides and oxygen: a narrative review
Natriuretic peptides and oxygen: a narrative reviewNatriuretic peptides and oxygen: a narrative review
Natriuretic peptides and oxygen: a narrative reviewOlliArjamaa
 
Faster matroid intersection
Faster matroid intersectionFaster matroid intersection
Faster matroid intersectionga sin
 
Memory safety in rust
Memory safety in rustMemory safety in rust
Memory safety in rustJawahar
 
Golangで並行シミュレーテッドアニーリング
Golangで並行シミュレーテッドアニーリングGolangで並行シミュレーテッドアニーリング
Golangで並行シミュレーテッドアニーリングtsuji daishiro
 
関数型プログラミング入門 for Matlab ユーザー
関数型プログラミング入門 for Matlab ユーザー関数型プログラミング入門 for Matlab ユーザー
関数型プログラミング入門 for Matlab ユーザーIchiro Maruta
 
From project to product mindset and onwards to product platform architectures
From project to product mindset and onwards to product platform architecturesFrom project to product mindset and onwards to product platform architectures
From project to product mindset and onwards to product platform architecturesJorn Bettin
 
Екі таңбалы санды бір таңбалы санға разрядтан аттап жазбаша көбейту
Екі таңбалы санды бір таңбалы санға разрядтан аттап жазбаша көбейтуЕкі таңбалы санды бір таңбалы санға разрядтан аттап жазбаша көбейту
Екі таңбалы санды бір таңбалы санға разрядтан аттап жазбаша көбейтуАйбек Қуандықұлы
 
Long short-term memory (LSTM)
Long short-term memory (LSTM)Long short-term memory (LSTM)
Long short-term memory (LSTM)Kenta Ishii
 
SPACE: Unsupervised Object-Oriented Scene Representation via Spatial Attentio...
SPACE: Unsupervised Object-Oriented Scene Representation via Spatial Attentio...SPACE: Unsupervised Object-Oriented Scene Representation via Spatial Attentio...
SPACE: Unsupervised Object-Oriented Scene Representation via Spatial Attentio...Hideki Tsunashima
 
シリーズML-06 ニューラルネットワークによる線形回帰
シリーズML-06 ニューラルネットワークによる線形回帰シリーズML-06 ニューラルネットワークによる線形回帰
シリーズML-06 ニューラルネットワークによる線形回帰Katsuhiro Morishita
 
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video UnderstandingToru Tamaki
 
FPGAを用いたフルパイプラインによるバイラテラルフィルタの高速化手法
FPGAを用いたフルパイプラインによるバイラテラルフィルタの高速化手法FPGAを用いたフルパイプラインによるバイラテラルフィルタの高速化手法
FPGAを用いたフルパイプラインによるバイラテラルフィルタの高速化手法Nobuho Hashimoto
 
Hyperbolic Deep Reinforcement Learning
Hyperbolic Deep Reinforcement LearningHyperbolic Deep Reinforcement Learning
Hyperbolic Deep Reinforcement LearningSangwoo Mo
 

What's hot (20)

Webシステムプログラミング設計書2015
Webシステムプログラミング設計書2015Webシステムプログラミング設計書2015
Webシステムプログラミング設計書2015
 
Java start01 in 2hours
Java start01 in 2hoursJava start01 in 2hours
Java start01 in 2hours
 
Natriuretic peptides and oxygen: a narrative review
Natriuretic peptides and oxygen: a narrative reviewNatriuretic peptides and oxygen: a narrative review
Natriuretic peptides and oxygen: a narrative review
 
Faster matroid intersection
Faster matroid intersectionFaster matroid intersection
Faster matroid intersection
 
Memory safety in rust
Memory safety in rustMemory safety in rust
Memory safety in rust
 
Golangで並行シミュレーテッドアニーリング
Golangで並行シミュレーテッドアニーリングGolangで並行シミュレーテッドアニーリング
Golangで並行シミュレーテッドアニーリング
 
関数型プログラミング入門 for Matlab ユーザー
関数型プログラミング入門 for Matlab ユーザー関数型プログラミング入門 for Matlab ユーザー
関数型プログラミング入門 for Matlab ユーザー
 
Jokyo20110711
Jokyo20110711Jokyo20110711
Jokyo20110711
 
From project to product mindset and onwards to product platform architectures
From project to product mindset and onwards to product platform architecturesFrom project to product mindset and onwards to product platform architectures
From project to product mindset and onwards to product platform architectures
 
Екі таңбалы санды бір таңбалы санға разрядтан аттап жазбаша көбейту
Екі таңбалы санды бір таңбалы санға разрядтан аттап жазбаша көбейтуЕкі таңбалы санды бір таңбалы санға разрядтан аттап жазбаша көбейту
Екі таңбалы санды бір таңбалы санға разрядтан аттап жазбаша көбейту
 
Long short-term memory (LSTM)
Long short-term memory (LSTM)Long short-term memory (LSTM)
Long short-term memory (LSTM)
 
SPACE: Unsupervised Object-Oriented Scene Representation via Spatial Attentio...
SPACE: Unsupervised Object-Oriented Scene Representation via Spatial Attentio...SPACE: Unsupervised Object-Oriented Scene Representation via Spatial Attentio...
SPACE: Unsupervised Object-Oriented Scene Representation via Spatial Attentio...
 
シリーズML-06 ニューラルネットワークによる線形回帰
シリーズML-06 ニューラルネットワークによる線形回帰シリーズML-06 ニューラルネットワークによる線形回帰
シリーズML-06 ニューラルネットワークによる線形回帰
 
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
 
Business Agility com Strategic Inception na Icatu Seguros
Business Agility com Strategic Inception na Icatu SegurosBusiness Agility com Strategic Inception na Icatu Seguros
Business Agility com Strategic Inception na Icatu Seguros
 
Business agility
Business agilityBusiness agility
Business agility
 
Agilidade Solidária: Lean & Agile Mindset é a base para uma Transformação e n...
Agilidade Solidária: Lean & Agile Mindset é a base para uma Transformação e n...Agilidade Solidária: Lean & Agile Mindset é a base para uma Transformação e n...
Agilidade Solidária: Lean & Agile Mindset é a base para uma Transformação e n...
 
FPGAを用いたフルパイプラインによるバイラテラルフィルタの高速化手法
FPGAを用いたフルパイプラインによるバイラテラルフィルタの高速化手法FPGAを用いたフルパイプラインによるバイラテラルフィルタの高速化手法
FPGAを用いたフルパイプラインによるバイラテラルフィルタの高速化手法
 
¿Por qué necesito Agilidad?
¿Por qué necesito Agilidad?¿Por qué necesito Agilidad?
¿Por qué necesito Agilidad?
 
Hyperbolic Deep Reinforcement Learning
Hyperbolic Deep Reinforcement LearningHyperbolic Deep Reinforcement Learning
Hyperbolic Deep Reinforcement Learning
 

Similar to CUDAを利用したPIV解析の高速化

DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519Yasuhiro Ishii
 
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
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013Ryo Sakamoto
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11えぴ 福田
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングKiwamu Okabe
 
GPUをJavaで使う話(Java Casual Talks #1)
GPUをJavaで使う話(Java Casual Talks #1)GPUをJavaで使う話(Java Casual Talks #1)
GPUをJavaで使う話(Java Casual Talks #1)なおき きしだ
 
コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道なおき きしだ
 
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかお前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかKousuke Ebihara
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件yaegashi
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案yohhoy
 
動的計画法の並列化
動的計画法の並列化動的計画法の並列化
動的計画法の並列化Proktmr
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelereaseShiqiao Du
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 

Similar to CUDAを利用したPIV解析の高速化 (20)

DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミング
 
GPUをJavaで使う話(Java Casual Talks #1)
GPUをJavaで使う話(Java Casual Talks #1)GPUをJavaで使う話(Java Casual Talks #1)
GPUをJavaで使う話(Java Casual Talks #1)
 
コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道
 
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかお前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのか
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件
 
Slide
SlideSlide
Slide
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
動的計画法の並列化
動的計画法の並列化動的計画法の並列化
動的計画法の並列化
 
Cuda
CudaCuda
Cuda
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 

More from 翔新 史

ハッカソンに使うSwift & Swift 3.0のGCD
ハッカソンに使うSwift & Swift 3.0のGCDハッカソンに使うSwift & Swift 3.0のGCD
ハッカソンに使うSwift & Swift 3.0のGCD翔新 史
 
CUDAを利用したPIV解析の高速化に関する研究(卒業発表)
CUDAを利用したPIV解析の高速化に関する研究(卒業発表)CUDAを利用したPIV解析の高速化に関する研究(卒業発表)
CUDAを利用したPIV解析の高速化に関する研究(卒業発表)翔新 史
 
Steve jobs introducton
Steve jobs introductonSteve jobs introducton
Steve jobs introducton翔新 史
 
2010 english honors camp music intro
2010 english honors camp music intro2010 english honors camp music intro
2010 english honors camp music intro翔新 史
 
事業計画書
事業計画書事業計画書
事業計画書翔新 史
 
工学部の魅力
工学部の魅力工学部の魅力
工学部の魅力翔新 史
 
Honors camp music intro
Honors camp music introHonors camp music intro
Honors camp music intro翔新 史
 

More from 翔新 史 (7)

ハッカソンに使うSwift & Swift 3.0のGCD
ハッカソンに使うSwift & Swift 3.0のGCDハッカソンに使うSwift & Swift 3.0のGCD
ハッカソンに使うSwift & Swift 3.0のGCD
 
CUDAを利用したPIV解析の高速化に関する研究(卒業発表)
CUDAを利用したPIV解析の高速化に関する研究(卒業発表)CUDAを利用したPIV解析の高速化に関する研究(卒業発表)
CUDAを利用したPIV解析の高速化に関する研究(卒業発表)
 
Steve jobs introducton
Steve jobs introductonSteve jobs introducton
Steve jobs introducton
 
2010 english honors camp music intro
2010 english honors camp music intro2010 english honors camp music intro
2010 english honors camp music intro
 
事業計画書
事業計画書事業計画書
事業計画書
 
工学部の魅力
工学部の魅力工学部の魅力
工学部の魅力
 
Honors camp music intro
Honors camp music introHonors camp music intro
Honors camp music intro
 

Recently uploaded

TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationYukiTerazawa
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfyukisuga3
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024koheioishi1
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ssusere0a682
 
UniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptUniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptyuitoakatsukijp
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2Tokyo Institute of Technology
 

Recently uploaded (6)

TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdf
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
 
UniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptUniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScript
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
 

CUDAを利用したPIV解析の高速化

  • 1. CUDAを利用したPIV解析の 高速化に関する研究 指導教員 熱工学研究室 二宮 尚 史 翔新
  • 2. CUDAを利用したPIV解析の 高速化に関する研究 指導教員 熱工学研究室 二宮 尚 史 翔新
  • 3. PIV
  • 4. Particle Image Velocimetry 粒子画像流速測定法
  • 5.
  • 6.
  • 7.
  • 8.
  • 9. 時刻 t 時刻 t+Δt
  • 10.
  • 11.
  • 14. 時刻t 時刻t+Δt
  • 15. 時刻t 時刻t+Δt
  • 16. 時刻t 時刻t+Δt
  • 17. 時刻t 時刻t+Δt
  • 18. 時刻t 時刻t+Δt
  • 19. 時刻t 時刻t+Δt
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 32.
  • 33.
  • 36.
  • 37. GPU Graphics Processing Unit 画像演算装置
  • 38. GPU Graphics Processing Unit 画像演算装置
  • 39. GPGPU General Purpose Graphics Processing Unit 汎用目的画像演算装置
  • 40. SM数 SP数 名前 (CPU数相当) (コア数相当) GeForce GT 12 96 240 GeForce GTX 48 384 560 Ti GeForce GTX 168 1,344 660 Ti 主流のグラフィックボードスペック
  • 41. スパコン 単一CPU 単一GPU 演算能力 ◎ ⃝ △ 単一スレッド ◎ ◎ ⃝ 演算速度 マルチスレッド ◎ △ ⃝ 演算速度 運用コスト ☓ ⃝ ⃝
  • 42. スパコン 単一CPU 単一GPU 演算能力 ◎ ⃝ △ 単一スレッド ◎ ◎ ⃝ 演算速度 マルチスレッド ◎ △ ⃝ 演算速度 運用コスト ☓ ⃝ ⃝
  • 43. スパコン 単一CPU 単一GPU 演算能力 ◎ ⃝ △ 単一スレッド ◎ ◎ ⃝ 演算速度 マルチスレッド ◎ △ ⃝ 演算速度 運用コスト ☓ ⃝ ⃝
  • 44. GPGPU
  • 46. CPU C、Java、Ruby… GPGPU
  • 47. CPU C、Java、Ruby… GPGPU 言語?
  • 48.
  • 51. • CUDA • ATI Stream • OpenCL
  • 52. CUDA ATI Stream OpenCL 対応デバイス △ △ ⃝ 性能 ◎ ◎ ⃝ サポート ◎ △ ⃝
  • 53. CUDA ATI Stream OpenCL 対応デバイス △ △ ⃝ 性能 ◎ ◎ ⃝ サポート ◎ △ ⃝
  • 54. CUDA ATI Stream OpenCL 対応デバイス △ △ ⃝ 性能 ◎ ◎ ⃝ サポート ◎ △ ⃝
  • 55. CUDA ATI Stream OpenCL 対応デバイス △ △ ⃝ 性能 ◎ ◎ ⃝ サポート ◎ △ ⃝
  • 56. CUDA ATI Stream OpenCL 対応デバイス △ △ ⃝ 性能 ◎ ◎ ⃝ サポート ◎ △ ⃝
  • 57. CUDA
  • 58. C言語コード CUDAコード
  • 59. C言語コード CUDAコード #include <stdio.h> int main() { ! int n, *a; ! n = 100; ! a = (int *)malloc(n); ! ! func(a, n); ! ! return 0; } void func(int *a, int n) { ! int i; ! for (i = 0; i < n; i++) { ! ! a[i] = i; ! } }
  • 60. C言語コード CUDAコード #include <stdio.h> #include <stdio.h> int main() { int main() { ! int n, *a; ! int n, *cpu_a, *gpu_a; ! n = 100; ! n = 100; ! a = (int *)malloc(n); ! cpu_a = (int *)malloc(n); ! cudaMalloc((void **)&gpu_a, n); ! ! ! func(a, n); ! func<<<3, 32>>>(gpu_a, n); ! cudaMemcpy(cpu_a, gpu_a, n, cudaMemcpyDeviceToHost); ! ! ! return 0; ! return 0; } } void func(int *a, int n) { __global__ void func(int *a, int n) { ! int i; ! int i; ! i = blockIdx.x * blockDim.x + threadIdx.x; ! ! for (i = 0; i < n; i++) { ! if (i < n) { ! ! a[i] = i; ! ! a[i] = i; ! } ! } } }
  • 61. C言語コード CUDAコード #include <stdio.h> #include <stdio.h> int main() { int main() { ! int n, *a; ! int n, *cpu_a, *gpu_a; ! n = 100; ! n = 100; ! a = (int *)malloc(n); ! cpu_a = (int *)malloc(n); ! cudaMalloc((void **)&gpu_a, n); ! ! ! func(a, n); ! func<<<3, 32>>>(gpu_a, n); ! cudaMemcpy(cpu_a, gpu_a, n, cudaMemcpyDeviceToHost); ! ! ! return 0; ! return 0; } } void func(int *a, int n) { __global__ void func(int *a, int n) { ! int i; ! int i; ! i = blockIdx.x * blockDim.x + threadIdx.x; ! ! for (i = 0; i < n; i++) { ! if (i < n) { ! ! a[i] = i; ! ! a[i] = i; ! } ! } } }
  • 62. C言語コード CUDAコード #include <stdio.h> #include <stdio.h> int main() { int main() { ! int n, *a; ! int n, *cpu_a, *gpu_a; ! n = 100; ! n = 100; ! a = (int *)malloc(n); ! cpu_a = (int *)malloc(n); ! cudaMalloc((void **)&gpu_a, n); ! ! ! func(a, n); ! func<<<3, 32>>>(gpu_a, n); ! cudaMemcpy(cpu_a, gpu_a, n, cudaMemcpyDeviceToHost); ! ! ! return 0; ! return 0; } } void func(int *a, int n) { __global__ void func(int *a, int n) { ! int i; ! int i; ! i = blockIdx.x * blockDim.x + threadIdx.x; ! ! for (i = 0; i < n; i++) { ! if (i < n) { ! ! a[i] = i; ! ! a[i] = i; ! } ! } } }
  • 63. C言語コード CUDAコード #include <stdio.h> #include <stdio.h> int main() { int main() { ! int n, *a; ! int n, *cpu_a, *gpu_a; ! n = 100; ! n = 100; ! a = (int *)malloc(n); ! cpu_a = (int *)malloc(n); ! cudaMalloc((void **)&gpu_a, n); ! ! ! func(a, n); ! func<<<3, 32>>>(gpu_a, n); ! cudaMemcpy(cpu_a, gpu_a, n, cudaMemcpyDeviceToHost); ! ! ! return 0; ! return 0; } } void func(int *a, int n) { __global__ void func(int *a, int n) { ! int i; ! int i; ! i = blockIdx.x * blockDim.x + threadIdx.x; ! ! for (i = 0; i < n; i++) { ! if (i < n) { ! ! a[i] = i; ! ! a[i] = i; ! } ! } } }
  • 64. C言語コード CUDAコード #include <stdio.h> #include <stdio.h> int main() { int main() { ! int n, *a; ! int n, *cpu_a, *gpu_a; ! n = 100; ! n = 100; ! a = (int *)malloc(n); ! cpu_a = (int *)malloc(n); ! cudaMalloc((void **)&gpu_a, n); ! ! ! func(a, n); ! func<<<3, 32>>>(gpu_a, n); ! cudaMemcpy(cpu_a, gpu_a, n, cudaMemcpyDeviceToHost); ! ! ! return 0; ! return 0; } } void func(int *a, int n) { __global__ void func(int *a, int n) { ! int i; ! int i; ! i = blockIdx.x * blockDim.x + threadIdx.x; ! ! for (i = 0; i < n; i++) { ! if (i < n) { ! ! a[i] = i; ! ! a[i] = i; ! } ! } } }
  • 65. C言語コード CUDAコード #include <stdio.h> #include <stdio.h> int main() { int main() { ! int n, *a; ! int n, *cpu_a, *gpu_a; ! n = 100; ! n = 100; ! a = (int *)malloc(n); ! cpu_a = (int *)malloc(n); ! cudaMalloc((void **)&gpu_a, n); ! ! ! func(a, n); ! func<<<3, 32>>>(gpu_a, n); ! cudaMemcpy(cpu_a, gpu_a, n, cudaMemcpyDeviceToHost); ! ! ! return 0; ! return 0; } } void func(int *a, int n) { __global__ void func(int *a, int n) { ! int i; ! int i; ! i = blockIdx.x * blockDim.x + threadIdx.x; ! ! for (i = 0; i < n; i++) { ! if (i < n) { ! ! a[i] = i; ! ! a[i] = i; ! } ! } } }
  • 66. C言語コード CUDAコード #include <stdio.h> #include <stdio.h> int main() { int main() { ! int n, *a; ! int n, *cpu_a, *gpu_a; ! n = 100; ! n = 100; ! a = (int *)malloc(n); ! cpu_a = (int *)malloc(n); ! cudaMalloc((void **)&gpu_a, n); ! ! ! func(a, n); ! func<<<3, 32>>>(gpu_a, n); ! cudaMemcpy(cpu_a, gpu_a, n, cudaMemcpyDeviceToHost); ! ! ! return 0; ! return 0; } } void func(int *a, int n) { __global__ void func(int *a, int n) { ! int i; ! int i; ! i = blockIdx.x * blockDim.x + threadIdx.x; ! ! for (i = 0; i < n; i++) { ! if (i < n) { ! ! a[i] = i; ! ! a[i] = i; ! } ! } } }
  • 67. C言語コード CUDAコード #include <stdio.h> #include <stdio.h> int main() { int main() { ! int n, *a; ! int n, *cpu_a, *gpu_a; ! n = 100; ! n = 100; ! a = (int *)malloc(n); ! cpu_a = (int *)malloc(n); ! cudaMalloc((void **)&gpu_a, n); ! ! ! func(a, n); ! func<<<3, 32>>>(gpu_a, n); ! cudaMemcpy(cpu_a, gpu_a, n, cudaMemcpyDeviceToHost); ! ! ! return 0; ! return 0; } } void func(int *a, int n) { __global__ void func(int *a, int n) { ! int i; ! int i; ! i = blockIdx.x * blockDim.x + threadIdx.x; ! ! for (i = 0; i < n; i++) { ! if (i < n) { ! ! a[i] = i; ! ! a[i] = i; ! } ! } } }
  • 68. PIV解析実行時間比較 90 sec 60 sec 30 sec i:24; w: 24 i:32; w:32 i:48; w:48 i: 16; w: 16
  • 69. PIV解析実行時間比較 90 sec C言語(Intel Core 2 Duo P8400 2.26GHz) 60 sec 30 sec i:24; w: 24 i:32; w:32 i:48; w:48 i: 16; w: 16
  • 70. PIV解析実行時間比較 90 sec C言語(Intel Core 2 Duo P8400 2.26GHz) 60 sec 30 sec C言語(Intel Core i5 2400s 2.5GHz) i:24; w: 24 i:32; w:32 i:48; w:48 i: 16; w: 16
  • 71. PIV解析実行時間比較 90 sec C言語(Intel Core 2 Duo P8400 2.26GHz) 60 sec 30 sec C言語(Intel Core i5 2400s 2.5GHz) CUDA(Nvidia GeForce GTX 560 Ti) i:24; w: 24 i:32; w:32 i:48; w:48 i: 16; w: 16
  • 72. 倍以上の速さ ※Core i5の実行速度より
  • 73. 3 倍以上の速さ ※Core i5の実行速度より
  • 74. 3 倍以上の速さ ※Core i5の実行速度より ※最適化無し
  • 75. 300 倍以上の速さ ※Core i5の実行速度より ※最適化した場合の予想値
  • 76. CUDAを用いた場合のPIV解析時間 0 sec 10 sec 20 sec 30 sec 40 sec 50 sec 2枚 30枚 現在値 予想値 ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
  • 77. CUDAを用いた場合のPIV解析時間 0 sec 10 sec 20 sec 30 sec 40 sec 50 sec 2.75 sec 2枚 30枚 現在値 予想値 ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
  • 78. CUDAを用いた場合のPIV解析時間 0 sec 10 sec 20 sec 30 sec 40 sec 50 sec 2.75 sec 2枚 0.03 sec 30枚 現在値 予想値 ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
  • 79. CUDAを用いた場合のPIV解析時間 0 sec 10 sec 20 sec 30 sec 40 sec 50 sec 2.75 sec 2枚 0.03 sec 41.25 sec 30枚 現在値 予想値 ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
  • 80. CUDAを用いた場合のPIV解析時間 0 sec 10 sec 20 sec 30 sec 40 sec 50 sec 2.75 sec 2枚 0.03 sec 41.25 sec 30枚 0.41 sec 現在値 予想値 ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
  • 81. CUDAを用いた場合のPIV解析時間 0 sec 10 sec 20 sec 30 sec 40 sec 50 sec 2.75 sec 2枚 0.03 sec 41.25 sec 30枚 0.41 sec 現在値 予想値 30枚を処理するのに1秒以下 ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
  • 83.

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n
  133. \n
  134. \n
  135. \n
  136. \n
  137. \n
  138. \n
  139. \n
  140. \n
  141. \n
  142. \n
  143. \n
  144. \n
  145. \n
  146. \n
  147. \n
  148. \n
  149. \n
  150. \n
  151. \n
  152. \n
  153. \n
  154. \n
  155. \n
  156. \n
  157. \n
  158. \n
  159. \n
  160. \n
  161. \n
  162. \n
  163. \n
  164. \n
  165. \n
  166. \n
  167. \n
  168. \n
  169. \n
  170. \n
  171. \n
  172. \n
  173. \n
  174. \n
  175. \n
  176. \n
  177. \n
  178. \n
  179. \n
  180. \n
  181. \n
  182. \n
  183. \n
  184. \n
  185. \n
  186. \n
  187. \n
  188. \n
  189. \n
  190. \n
  191. \n
  192. \n
  193. \n
  194. \n
  195. \n
  196. \n
  197. \n
  198. \n
  199. \n
  200. \n
  201. \n
  202. \n
  203. \n
  204. \n
  205. \n
  206. \n
  207. \n
  208. \n
  209. \n
  210. \n
  211. \n
  212. \n
  213. \n
  214. \n
  215. \n
  216. \n
  217. \n
  218. \n
  219. \n
  220. \n
  221. \n
  222. \n
  223. \n
  224. \n
  225. \n
  226. \n
  227. \n
  228. \n
  229. \n
  230. \n
  231. \n
  232. \n
  233. \n
  234. \n
  235. \n
  236. \n
  237. \n
  238. \n
  239. \n
  240. \n
  241. \n
  242. \n
  243. \n
  244. \n
  245. \n
  246. \n
  247. \n
  248. \n
  249. \n
  250. \n
  251. \n
  252. \n
  253. \n
  254. \n
  255. \n
  256. \n
  257. \n
  258. \n
  259. \n
  260. \n
  261. \n
  262. \n
  263. \n
  264. \n
  265. \n
  266. \n
  267. \n
  268. \n
  269. \n
  270. \n
  271. \n
  272. \n
  273. \n
  274. \n
  275. \n
  276. \n
  277. \n
  278. \n
  279. \n
  280. \n
  281. \n
  282. \n
  283. \n
  284. \n
  285. \n
  286. \n
  287. \n
  288. \n
  289. \n
  290. \n
  291. \n
  292. \n
  293. \n
  294. \n
  295. \n
  296. \n
  297. \n
  298. \n
  299. \n
  300. \n
  301. \n
  302. \n
  303. \n
  304. \n
  305. \n
  306. \n
  307. \n
  308. \n
  309. \n
  310. \n
  311. \n
  312. \n
  313. \n
  314. \n
  315. \n
  316. \n
  317. \n
  318. \n
  319. \n
  320. \n
  321. \n
  322. \n
  323. \n
  324. \n
  325. \n
  326. \n
  327. \n
  328. \n
  329. \n
  330. \n
  331. \n
  332. \n
  333. \n
  334. \n
  335. \n
  336. \n
  337. \n
  338. \n
  339. \n
  340. \n
  341. \n
  342. \n
  343. \n
  344. \n
  345. \n
  346. \n
  347. \n
  348. \n
  349. \n
  350. \n
  351. \n
  352. \n
  353. \n
  354. \n
  355. \n
  356. \n
  357. \n
  358. \n
  359. \n
  360. \n
  361. \n
  362. \n
  363. \n
  364. \n
  365. \n
  366. \n
  367. \n
  368. \n
  369. \n
  370. \n
  371. \n
  372. \n
  373. \n
  374. \n
  375. \n
  376. \n
  377. \n
  378. \n
  379. \n
  380. \n
  381. \n
  382. \n
  383. \n
  384. \n
  385. \n
  386. \n
  387. \n
  388. \n
  389. \n
  390. \n
  391. \n
  392. \n
  393. \n
  394. \n
  395. \n
  396. \n
  397. \n
  398. \n
  399. \n
  400. \n
  401. \n
  402. \n
  403. \n
  404. \n
  405. \n
  406. \n
  407. \n
  408. \n
  409. \n
  410. \n
  411. \n
  412. \n
  413. \n
  414. \n
  415. \n
  416. &amp;#x6539;&amp;#x826F;&amp;#xFF1A;\nGPU&amp;#x306E;&amp;#x6027;&amp;#x80FD;&amp;#x3092;&amp;#x6700;&amp;#x5927;&amp;#x9650;&amp;#x306B;\n&amp;#x30B5;&amp;#x30D6;&amp;#x30D4;&amp;#x30AF;&amp;#x30BB;&amp;#x30EB;&amp;#x7CBE;&amp;#x5EA6;&amp;#x3084;&amp;#x8AA4;&amp;#x30D9;&amp;#x30AF;&amp;#x30C8;&amp;#x30EB;&amp;#x9664;&amp;#x53BB;&amp;#x306E;&amp;#x6A5F;&amp;#x80FD;&amp;#x5B9F;&amp;#x88C5;\n
  417. &amp;#x6539;&amp;#x826F;&amp;#xFF1A;\nGPU&amp;#x306E;&amp;#x6027;&amp;#x80FD;&amp;#x3092;&amp;#x6700;&amp;#x5927;&amp;#x9650;&amp;#x306B;\n&amp;#x30B5;&amp;#x30D6;&amp;#x30D4;&amp;#x30AF;&amp;#x30BB;&amp;#x30EB;&amp;#x7CBE;&amp;#x5EA6;&amp;#x3084;&amp;#x8AA4;&amp;#x30D9;&amp;#x30AF;&amp;#x30C8;&amp;#x30EB;&amp;#x9664;&amp;#x53BB;&amp;#x306E;&amp;#x6A5F;&amp;#x80FD;&amp;#x5B9F;&amp;#x88C5;\n
  418. \n