2016年7月13日水曜日

GPU ライブラリ “ArrayFire” (Ubuntu 14.04)

C/C++ で力学シミュレータを作るときに,逆行列を掛けるのが面倒なので,
C++ 用のベクトル・行列ライブラリを探してみました.

文法の美しさでは Eigen がよかった.すごいかっちょいいソースが書けます.ヘッダーファイルだけというのもお手軽.

http://eigen.tuxfamily.org/

でも,CUDA で並列計算したいときは ArrayFire がいい感じ.ソースファイルは共通のまま,g++ のリンカーオプションを取り替えるだけで,CPU用とGPU用をコンパイルできます.

http://arrayfire.org/


Ubuntu 14.04 へのインストール


1.ダウンロード
http://arrayfire.com/download/

2.準備
※本家の説明ではパッケージ名 libglfw3 が誤植で glfw3 になってた.
sudo apt-get install libfreeimage-dev libatlas3gf-base libfftw3-dev cmake
sudo apt-add-repository ppa:keithw/glfw3
sudo apt-get update
sudo apt-get install libglfw3

3.インストール
sudo sh ArrayFire-*_Linux_x86_64.sh --exclude-subdir --prefix=/usr/local

4.コンパイル

ソースコードの例:

#include <arrayfire.h>
// Generate random data, sum and print the result.
int main(void)
{
    // Generate 10,000 random values
    af::array a = af::randu(10000);
    // Sum the values and copy the result to the CPU:
    double sum = af::sum<float>(a);
    printf("sum: %g\n", sum);
    return 0;
}


Makefileの例: ※$(CC)の前は,スペースじゃなくてタブにします.

#-lafcpu, -lafcuda, or -laf for the CPU, CUDA, and unified backends
LIBS=-lafcpu
LIB_PATHS=-L/usr/local/lib
INCLUDES=-I/usr/local/include
CC=g++ $(COMPILER_OPTIONS)
COMPILER_OPTIONS=-std=c++11 -g
all: main.cpp Makefile
    $(CC) main.cpp -o test $(INCLUDES) $(LIBS) $(LIB_PATHS)