Raspberry PiでOpenCLを触ってみた

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をやってみる.