Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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解析はベクトルが多い 一回の解析で数千∼数万のベクトル
同時演算
同時演算に優れたデバイス?
GPUGraphics Processing Unit     画像演算装置
GPUGraphics Processing Unit 画像演算装置
GPGPUGeneral Purpose Graphics Processing Unit         汎用目的画像演算装置
SM数       SP数   名前              (CPU数相当) (コア数相当)GeForce GT                 12        96   240GeForce GTX                 4...
スパコン   単一CPU   単一GPU 演算能力      ◎      ⃝       △単一スレッド           ◎      ◎       ⃝ 演算速度マルチスレッド           ◎      △       ⃝  演...
スパコン   単一CPU   単一GPU 演算能力      ◎      ⃝       △単一スレッド           ◎      ◎       ⃝ 演算速度マルチスレッド           ◎      △       ⃝  演...
スパコン   単一CPU   単一GPU 演算能力      ◎      ⃝       △単一スレッド           ◎      ◎       ⃝ 演算速度マルチスレッド           ◎      △       ⃝  演...
GPGPU
CPUGPGPU
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);...
C言語コード                         CUDAコード#include <stdio.h>              #include <stdio.h>int main() {                    in...
C言語コード                         CUDAコード#include <stdio.h>              #include <stdio.h>int main() {                    in...
C言語コード                         CUDAコード#include <stdio.h>              #include <stdio.h>int main() {                    in...
C言語コード                         CUDAコード#include <stdio.h>              #include <stdio.h>int main() {                    in...
C言語コード                         CUDAコード#include <stdio.h>              #include <stdio.h>int main() {                    in...
C言語コード                         CUDAコード#include <stdio.h>              #include <stdio.h>int main() {                    in...
C言語コード                         CUDAコード#include <stdio.h>              #include <stdio.h>int main() {                    in...
C言語コード                         CUDAコード#include <stdio.h>              #include <stdio.h>int main() {                    in...
PIV解析実行時間比較90 sec60 sec30 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 sec30 sec                  i:24; w: 24   ...
PIV解析実行時間比較90 sec                          C言語(Intel Core 2 Duo P8400 2.26GHz)60 sec30 sec                                ...
PIV解析実行時間比較90 sec                          C言語(Intel Core 2 Duo P8400 2.26GHz)60 sec30 sec                                ...
倍以上の速さ         ※Core i5の実行速度より
3倍以上の速さ         ※Core i5の実行速度より
3倍以上の速さ         ※Core i5の実行速度より                ※最適化無し
300倍以上の速さ         ※Core i5の実行速度より         ※最適化した場合の予想値
CUDAを用いた場合のPIV解析時間  0 sec   10 sec   20 sec   30 sec   40 sec   50 sec2枚30枚           現在値                  予想値            ...
CUDAを用いた場合のPIV解析時間  0 sec         10 sec   20 sec   30 sec   40 sec   50 sec          2.75 sec2枚30枚                 現在値   ...
CUDAを用いた場合のPIV解析時間  0 sec          10 sec   20 sec   30 sec   40 sec   50 sec          2.75 sec2枚      0.03 sec30枚        ...
CUDAを用いた場合のPIV解析時間  0 sec          10 sec   20 sec   30 sec   40 sec      50 sec          2.75 sec2枚      0.03 sec        ...
CUDAを用いた場合のPIV解析時間  0 sec           10 sec   20 sec   30 sec   40 sec      50 sec          2.75 sec2枚      0.03 sec       ...
CUDAを用いた場合のPIV解析時間  0 sec           10 sec   20 sec   30 sec   40 sec      50 sec          2.75 sec2枚      0.03 sec       ...
フレームレートより速い解析スピード
リアルタイムレンダリング
解析スタイルを大きく変えるリアルタイムレンダリング
今後の課題
今後の課題• PIV(OCC)プログラムの改良
今後の課題• PIV(OCC)プログラムの改良• リアルタイムレンダリング(理想)
!ank y"
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
Upcoming SlideShare
Loading in …5
×

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

1,218 views

Published on

宇都宮大学工学部機械システム工学科2012年度演習発表

卒業発表は以下から:
http://www.slideshare.net/shonetesmith/ss-16478924

卒業論文のダウンロードは以下のアドレスにあります:
http://ace.ees.utsunomiya-u.ac.jp/research/cudaを利用したpiv解析の高速化に関する研究.html

Published in: Education
  • Be the first to comment

  • Be the first to like this

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

  1. 1. CUDAを利用したPIV解析の 高速化に関する研究指導教員 熱工学研究室二宮 尚 史 翔新
  2. 2. CUDAを利用したPIV解析の 高速化に関する研究指導教員 熱工学研究室二宮 尚 史 翔新
  3. 3. PIV
  4. 4. Particle Image Velocimetry 粒子画像流速測定法
  5. 5. 時刻 t 時刻 t+Δt
  6. 6. 時刻t
  7. 7. 時刻t
  8. 8. 時刻t 時刻t+Δt
  9. 9. 時刻t 時刻t+Δt
  10. 10. 時刻t 時刻t+Δt
  11. 11. 時刻t 時刻t+Δt
  12. 12. 時刻t 時刻t+Δt
  13. 13. 時刻t 時刻t+Δt
  14. 14. 時刻t
  15. 15. PIV解析はベクトルが多い
  16. 16. PIV解析はベクトルが多い• 画像サイズは1024×1024
  17. 17. PIV解析はベクトルが多い• 画像サイズは1024×1024• 検査領域サイズは8×8から48×48
  18. 18. PIV解析はベクトルが多い• 画像サイズは1024×1024• 検査領域サイズは8×8から48×48• オーバーラップは50%が平均的
  19. 19. PIV解析はベクトルが多い 一回の解析で数千∼数万のベクトル
  20. 20. 同時演算
  21. 21. 同時演算に優れたデバイス?
  22. 22. GPUGraphics Processing Unit 画像演算装置
  23. 23. GPUGraphics Processing Unit 画像演算装置
  24. 24. GPGPUGeneral Purpose Graphics Processing Unit 汎用目的画像演算装置
  25. 25. SM数 SP数 名前 (CPU数相当) (コア数相当)GeForce GT 12 96 240GeForce GTX 48 384 560 TiGeForce GTX 168 1,344 660 Ti 主流のグラフィックボードスペック
  26. 26. スパコン 単一CPU 単一GPU 演算能力 ◎ ⃝ △単一スレッド ◎ ◎ ⃝ 演算速度マルチスレッド ◎ △ ⃝ 演算速度運用コスト ☓ ⃝ ⃝
  27. 27. スパコン 単一CPU 単一GPU 演算能力 ◎ ⃝ △単一スレッド ◎ ◎ ⃝ 演算速度マルチスレッド ◎ △ ⃝ 演算速度運用コスト ☓ ⃝ ⃝
  28. 28. スパコン 単一CPU 単一GPU 演算能力 ◎ ⃝ △単一スレッド ◎ ◎ ⃝ 演算速度マルチスレッド ◎ △ ⃝ 演算速度運用コスト ☓ ⃝ ⃝
  29. 29. GPGPU
  30. 30. CPUGPGPU
  31. 31. CPU C、Java、Ruby…GPGPU
  32. 32. CPU C、Java、Ruby…GPGPU 言語?
  33. 33. • CUDA
  34. 34. • CUDA• ATI Stream
  35. 35. • CUDA• ATI Stream• OpenCL
  36. 36. CUDA ATI Stream OpenCL対応デバイス △ △ ⃝ 性能 ◎ ◎ ⃝サポート ◎ △ ⃝
  37. 37. CUDA ATI Stream OpenCL対応デバイス △ △ ⃝ 性能 ◎ ◎ ⃝サポート ◎ △ ⃝
  38. 38. CUDA ATI Stream OpenCL対応デバイス △ △ ⃝ 性能 ◎ ◎ ⃝サポート ◎ △ ⃝
  39. 39. CUDA ATI Stream OpenCL対応デバイス △ △ ⃝ 性能 ◎ ◎ ⃝サポート ◎ △ ⃝
  40. 40. CUDA ATI Stream OpenCL対応デバイス △ △ ⃝ 性能 ◎ ◎ ⃝サポート ◎ △ ⃝
  41. 41. CUDA
  42. 42. C言語コード CUDAコード
  43. 43. 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;! }}
  44. 44. 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;! } ! }} }
  45. 45. 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;! } ! }} }
  46. 46. 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;! } ! }} }
  47. 47. 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;! } ! }} }
  48. 48. 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;! } ! }} }
  49. 49. 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;! } ! }} }
  50. 50. 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;! } ! }} }
  51. 51. 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;! } ! }} }
  52. 52. PIV解析実行時間比較90 sec60 sec30 sec i:24; w: 24 i:32; w:32 i:48; w:48 i: 16; w: 16
  53. 53. PIV解析実行時間比較90 sec C言語(Intel Core 2 Duo P8400 2.26GHz)60 sec30 sec i:24; w: 24 i:32; w:32 i:48; w:48 i: 16; w: 16
  54. 54. PIV解析実行時間比較90 sec C言語(Intel Core 2 Duo P8400 2.26GHz)60 sec30 sec C言語(Intel Core i5 2400s 2.5GHz) i:24; w: 24 i:32; w:32 i:48; w:48 i: 16; w: 16
  55. 55. PIV解析実行時間比較90 sec C言語(Intel Core 2 Duo P8400 2.26GHz)60 sec30 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
  56. 56. 倍以上の速さ ※Core i5の実行速度より
  57. 57. 3倍以上の速さ ※Core i5の実行速度より
  58. 58. 3倍以上の速さ ※Core i5の実行速度より ※最適化無し
  59. 59. 300倍以上の速さ ※Core i5の実行速度より ※最適化した場合の予想値
  60. 60. CUDAを用いた場合のPIV解析時間 0 sec 10 sec 20 sec 30 sec 40 sec 50 sec2枚30枚 現在値 予想値 ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
  61. 61. CUDAを用いた場合のPIV解析時間 0 sec 10 sec 20 sec 30 sec 40 sec 50 sec 2.75 sec2枚30枚 現在値 予想値 ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
  62. 62. CUDAを用いた場合のPIV解析時間 0 sec 10 sec 20 sec 30 sec 40 sec 50 sec 2.75 sec2枚 0.03 sec30枚 現在値 予想値 ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
  63. 63. CUDAを用いた場合のPIV解析時間 0 sec 10 sec 20 sec 30 sec 40 sec 50 sec 2.75 sec2枚 0.03 sec 41.25 sec30枚 現在値 予想値 ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
  64. 64. CUDAを用いた場合のPIV解析時間 0 sec 10 sec 20 sec 30 sec 40 sec 50 sec 2.75 sec2枚 0.03 sec 41.25 sec30枚 0.41 sec 現在値 予想値 ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
  65. 65. CUDAを用いた場合のPIV解析時間 0 sec 10 sec 20 sec 30 sec 40 sec 50 sec 2.75 sec2枚 0.03 sec 41.25 sec30枚 0.41 sec 現在値 予想値 30枚を処理するのに1秒以下 ※画像サイズ:1024×1024;検査領域:48×48;探査領域:24×24
  66. 66. フレームレートより速い解析スピード
  67. 67. リアルタイムレンダリング
  68. 68. 解析スタイルを大きく変えるリアルタイムレンダリング
  69. 69. 今後の課題
  70. 70. 今後の課題• PIV(OCC)プログラムの改良
  71. 71. 今後の課題• PIV(OCC)プログラムの改良• リアルタイムレンダリング(理想)
  72. 72. !ank y"

×