tkokamoの日記

HPCの研究開発なのでそんなことをかきたい

openCLを動かしてみる

HPC関連の仕事してるくせに(システムソフトを作っているので)書いたことないから、作業記録を込めて簡単に動かしてみる。

openCLとは

wikipediaをみれば多分わかる。(自分は専門じゃないのでwikipediaが合っているかどうかはわからない) OpenCL - Wikipedia

GPUだとCUDAのイメージだけど、CUDAで買いたカーネルコードはマルチコアCPUでは動かないよね。

openCLクロスプラットフォーム対応なので、ハードウェアの違いを吸収してくれるからうれしい、、、らしい。

もちろんCUDAにはCUDAだからGPUを使いこなせる部分があるらしいが、、、こういう話はおいおいで良い。

動かすコード

ぱっと調べた感じ下の記事がよさそうだったので、紹介されているコードを試してみた。

OpenCLで行列の掛け算をしてみた : 試行錯誤な日々

普通に動いた。

[takuya@localhost c_opencl_practice]$ ls
README.md  hello.cl           hello_in_2_dims.cl   matrix_dot_matrix_on_cpu.c
hello.c    hello_in_2_dims.c  matrix_dot_matrix.c  multi_size_test.sh
[takuya@localhost c_opencl_practice]$ gcc matrix_dot_matrix.c -lOpenCL
[takuya@localhost c_opencl_practice]$ ./a.out 
matrix
   0.00  10.00  20.00  30.00  40.00  50.00  60.00  70.00  80.00  90.00
   1.00  11.00  21.00  31.00  41.00  51.00  61.00  71.00  81.00  91.00
   2.00  12.00  22.00  32.00  42.00  52.00  62.00  72.00  82.00  92.00
   3.00  13.00  23.00  33.00  43.00  53.00  63.00  73.00  83.00  93.00
   4.00  14.00  24.00  34.00  44.00  54.00  64.00  74.00  84.00  94.00
   5.00  15.00  25.00  35.00  45.00  55.00  65.00  75.00  85.00  95.00
   6.00  16.00  26.00  36.00  46.00  56.00  66.00  76.00  86.00  96.00
   7.00  17.00  27.00  37.00  47.00  57.00  67.00  77.00  87.00  97.00
   8.00  18.00  28.00  38.00  48.00  58.00  68.00  78.00  88.00  98.00
   9.00  19.00  29.00  39.00  49.00  59.00  69.00  79.00  89.00  99.00
matrix
   1.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
   0.00   2.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
   0.00   0.00   1.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
   0.00   0.00   0.00   1.00   0.00   0.00   0.00   0.00   0.00   0.00
   0.00   0.00   0.00   0.00   1.00   0.00   0.00   0.00   0.00   0.00
   0.00   0.00   0.00   0.00   0.00   1.00   0.00   0.00   0.00   0.00
   0.00   0.00   0.00   0.00   0.00   0.00   1.00   0.00   0.00   0.00
   0.00   0.00   0.00   0.00   0.00   0.00   0.00   1.00   0.00   0.00
   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   1.00   0.00
   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   1.00
CL_DEVICE_MAX_WORK_GROUP_SIZE: 8192
work item sizes:  8192 8192 8192
localWorkSize: 10, 10
matrix
   0.00  20.00  20.00  30.00  40.00  50.00  60.00  70.00  80.00  90.00
   1.00  22.00  21.00  31.00  41.00  51.00  61.00  71.00  81.00  91.00
   2.00  24.00  22.00  32.00  42.00  52.00  62.00  72.00  82.00  92.00
   3.00  26.00  23.00  33.00  43.00  53.00  63.00  73.00  83.00  93.00
   4.00  28.00  24.00  34.00  44.00  54.00  64.00  74.00  84.00  94.00
   5.00  30.00  25.00  35.00  45.00  55.00  65.00  75.00  85.00  95.00
   6.00  32.00  26.00  36.00  46.00  56.00  66.00  76.00  86.00  96.00
   7.00  34.00  27.00  37.00  47.00  57.00  67.00  77.00  87.00  97.00
   8.00  36.00  28.00  38.00  48.00  58.00  68.00  78.00  88.00  98.00
   9.00  38.00  29.00  39.00  49.00  59.00  69.00  79.00  89.00  99.00
Set matrix time: 0.000000 sec
Load device time: 0.000000 sec
Set kernel time: 0.230000 sec
Set memory time: 0.000000 sec
Set work size time: 0.000000 sec
Calc time: 0.000000 sec
Release resource time: 0.010000 sec
Total time: 0.240000 sec

ちゃんと並列化されているんだろうか、、、と思ったらちゃんと並列化されていない版もあった。 確かに違う。

●並列化した版
[takuya@localhost c_opencl_practice]$ ./a.out 2000
CL_DEVICE_MAX_WORK_GROUP_SIZE: 8192
work item sizes:  8192 8192 8192
localWorkSize: 2000, 1
Set matrix time: 0.030000 sec
Load device time: 0.010000 sec
Set kernel time: 0.170000 sec
Set memory time: 0.000000 sec
Set work size time: 0.000000 sec
Calc time: 5.090000 sec
Release resource time: 0.010000 sec
Total time: 5.310000 sec

●並列化しない版
[takuya@localhost c_opencl_practice]$ gcc matrix_dot_matrix_on_cpu.c 
[takuya@localhost c_opencl_practice]$ ./a.out 2000
Set matrix time: 0.040000 sec
Calc time: 26.190000 sec
Total time: 26.230000 seconds

とりあえず、今日はここまで。 次回はコードを見ていきたい。