openCLを動かしてみる
HPC関連の仕事してるくせに(システムソフトを作っているので)書いたことないから、作業記録を込めて簡単に動かしてみる。
openCLとは
wikipediaをみれば多分わかる。(自分は専門じゃないのでwikipediaが合っているかどうかはわからない) OpenCL - Wikipedia
GPUだとCUDAのイメージだけど、CUDAで買いたカーネルコードはマルチコアCPUでは動かないよね。
openCLはクロスプラットフォーム対応なので、ハードウェアの違いを吸収してくれるからうれしい、、、らしい。
もちろんCUDAにはCUDAだからGPUを使いこなせる部分があるらしいが、、、こういう話はおいおいで良い。
動かすコード
ぱっと調べた感じ下の記事がよさそうだったので、紹介されているコードを試してみた。
普通に動いた。
[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
とりあえず、今日はここまで。 次回はコードを見ていきたい。