FPGAでOpenCLを触ってみたいと考えていて,でもFPGAは特殊なので,前段階としてRaspberry PiでOpenCLを触ってみることにした.
今回は私が所持しているRaspberryPi2Bで話を進めるが,GPUはすべてのシリーズに搭載されているため,RPi3などでも動作させることができる.
概要
Raspberry PiのCPUやGPUの機能は,SoCの形で1チップに収められている.
GPUはVideoCore IVというアーキテクチャが使用され,これに関する資料はBCM2835のページのGPU Documentationから閲覧することができる.
VideoCore IVをOpenCLから扱うためのプロジェクトとしてVC4CLがあるため,今回はこれを使う.
VC4CL
OpenCL1.2を使ってVideoCore IVを触るためのプロジェクトらしい.環境設定の方法に関してはHow to getを参考に行う.
基本的にはHow to getのコマンドをコピペすれば良いが,dpkg -iを行った際にパッケージが足りないと言われる事がある.
私の環境ではvc4c.debのときにはclang-3.9,llvm-3.9,llvm-3.9-devの3つ,vc4cl.debではopencl-c-headersとocl-icd-opencl-devの2つが足りないと言われた.
足りないのでapt-get installで入れようとしたら”apt –fix-broken install”を使えと言われたので,適宜これを実行.
これでインストールは終了.
Hands On OpenCL
OpenCLのトレーニングコースはKhronos Technologiesのページで紹介されており,様々なものがある.
Hands On OpenCLはその中のひとつで,イギリスのBristol大学の教員が2日間の講義コースのために作成した資料となっている.
OpenCLについて理解しやすく,スライドと演習・解法が掲載されているため,今回はこれを使ってみる.
git clone git://github.com/HandsOnOpenCL/Exercises-Solutions.git
としてリポジトリをクローンする.
Exercise01にDeviceInfoという,環境を確認するプログラムがあるため,これを実行してみる.
root@BLUEDOG:~/vc4cl/Exercises-Solutions/Exercises/Exercise01/C# pwd /root/vc4cl/Exercises-Solutions/Exercises/Exercise01/C root@BLUEDOG:~/vc4cl/Exercises-Solutions/Exercises/Exercise01/C# make cc DeviceInfo.c -std=c99 -lOpenCL -I ../../C_common -o DeviceInfo root@BLUEDOG:~/vc4cl/Exercises-Solutions/Exercises/Exercise01/C# ls DeviceInfo DeviceInfo.c Makefile root@BLUEDOG:~/vc4cl/Exercises-Solutions/Exercises/Exercise01/C# ./DeviceInfo Number of OpenCL platforms: 1 ------------------------- Platform: OpenCL for the Raspberry Pi VideoCore IV GPU Vendor: doe300 Version: OpenCL 1.2 VC4CL 0.4 Number of devices: 1 ------------------------- Name: VideoCore IV GPU Version: OpenCL C 1.2 Max. Compute Units: 1 Local Memory Size: 65536 KB Global Memory Size: 64 MB Max Alloc Size: 64 MB Max Work-group Total Size: 12 Max Work-group Dims: ( 12 12 12 ) ------------------------- ------------------------- root@BLUEDOG:~/vc4cl/Exercises-Solutions/Exercises/Exercise01/C#
どうやら環境設定はうまくいっているように見える.
次にExercises02ではベクトルの加算のプログラムがあるため,makeして実行してみる.
root@BLUEDOG:~/vc4cl/Exercises-Solutions/Exercises/Exercise02/C# ./vadd Device is VideoCore IV GPU GPU from Broadcom with a max of 1 compute units The kernel ran in 0.002553 seconds C = A+B: 1024 out of 1024 results were correct.
これも動作している.
で,どれくらい高速化できるのかについて,Solutionsの方のExercise06を実行した.
root@BLUEDOG:~/vc4cl/Exercises-Solutions/Solutions/Exercise06/C# ./mult Using OpenCL device: VideoCore IV GPU ===== Sequential, matrix mult (dot prod), order 1024 on host CPU ====== 383.08 seconds at 5.6 MFLOPS ===== OpenCL, matrix mult, C(i,j) per work item, order 1024 ====== 216.92 seconds at 9.9 MFLOPS
1.77倍程度の高速化を行えていることが分かる.
その後
今はスライドを見つつ演習を進めている.
書籍や他のトレーニングも参考になる.
ある程度理解したらFPGAの方のOpenCLをやってみる.