Towards implementing ray tracing on FPGA at 2014.

While Imagination released a GPU IP with dedicated raytracing logic, still it would be meaningful to implement our own ray tracing on FPGA.

Here’s notes on ray tracing on FPGA nowdays(2014).

 

– Zynq

http://www.xilinx.com/products/silicon-devices/soc/zynq-7000/

ARM + FPGA logic.

 

Zynq-based FPGA dev board can be purchased from $200 for example ZYBO http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,719,1197&Prod=ZYBO

 

– SGRT: A Mobile GPU Architecture for Real-Time Ray Tracing

http://web.yonsei.ac.kr/wjlee/

 

– Towards Hardware Ray Tracing using Fixed Point Arithmetic

Click to access HW-fixed-point.pdf

 

– Robust Ray-Bounding Volume Hierarchy Traversal with
Reduced Precision Integer Arithmetic

Click to access paper.pdf

Integer is saving its area by 6x than floating point .

PS4Eye をハイフレームレートステレオカメラとして使う(試み)

PS4Eye は最大 240fps を出力できるステレオカメラとして魅力です.

https://github.com/ps4eye/ps4eye

カスタムファームウェアを利用すれば Linux などでも USB カメラとして利用することができます.

ただし, PS4Eye はコネクタが独自なので, まずはケーブルを改造(?)して, USB3.0 ケーブルとうまく結線してあげる必要があります.

Image

 

USB3.0 ケーブルから出ている白と緑の線は UBS2.0 互換のための線のようなので, 結線する必要はありません(PS4Eye 側にそもそも対応する線が無い)

また, USB3.0 対応 PC でも初期のころのものは対応していない? ようです. 実際に繋がるかどうかは USB3.0 対応機器に刺してみて確認してみる必要があります

参考までに, Samsung’s ARM Chromebook では認識されましたが, Thinkpad T420s では認識されませんでした.

Image

Chromebook の Ubuntu Linux で, Chrome を使って webcamera として使ってみた図. 傍のピクセルがおかしいですが, もともと横 1000 ピクセルほどが無駄に reserve されているようなので, これで正しいのかもしれません.

RAW モード? 

さて, 現在の ps4eye ファームウェアツールでは YUV422 のピクセルフォーマットに設定されていますが, PS4Eye は仕様上は 12bit RAW(Bayer?)が取れるようになっています.

RAW で取れるとよりよい諧調が取得できて, ステレオ画像からのデプス推定や三次元復元で有益です. うまくレジスタを設定して取得できるようにしてみたいですね.

On ETTR(Exposure to the right)

最近の Magic Lantern では (Auto) ETTR という機能が付いていて, dynamic range の変化の大きい日の入り, 日の出の time lapse 撮影がやりやすくなっています.

たとえばこちら.

さて, ところで ETTR(Exposure to the right) とはなんでしょう? 日本語に訳すと “右側に露出” になりますが, この用語は日本では普及していないようで適切な訳がありません.

ETTR は, ヒストグラムを表示したときに, なるべくヒストグラムが右側に寄るように露出を調整する, という撮影テクニックになります.

ETTR によりセンサー値の範囲を活用することで, よりノイズの少ない撮影を行うことが可能になります.

撮像センサー(CCD, CMOS)は物理的な光量を記録するので, 入射した光の量と RAW の値はリニアになっています.

ただし人間の目はリニアには反応しないため, ライブビューでの表示や JPEG 画像に記録されるときには非線形の変換がかかります.

ただ, ETTR にも気をつけるべき問題があります. time lapse や RAW 動画で動画を撮るときは露出オーバーにならないように気をつける必要があります. ライブビューで撮影した画像を見たときは白飛びしているように見えるかもしれません(ライブビューで見るときにはトーンマップがかかっているので). 現像処理をするときも RAW(Linear) を基準として考える必要があります.

SDE + gcc 4.9 で AVX512 命令を試す

2014 年に Knights Landing が市場に投入されて AVX512 命令も一般的に使えるようになりそうですね.

Intel SDE(シミュレータ) と AVX512 対応 gcc を使って一足先に AVX512 命令を試してみましょう.

http://software.intel.com/en-us/articles/intel-software-development-emulator

から

– SDE
– GCC
– binutils

を落としましょう. 以下のようなコードを用意します.

#include <immintrin.h>

#include <stdio.h>

void fa(__m512* c, __m512* a, __m512* b)
{
  (*c) = _mm512_add_ps(*a, *b);
}

int
main(
  int argc,
  char** argv)
{
  __m512 a, b, c;

  a = _mm512_set_ps(argc , argc+1, argc+2, argc+3, argc+4, argc+5, argc+6,
    argc+7, argc+8, argc+9, argc+10, argc+11, argc+12, argc+13,
    argc+14, argc+15);
  b = a;

  fa(&c, &a, &b);

  float ret[16];
  _mm512_storeu_ps(ret, c);

  int i;
  for (i = 0; i < 16; i++) {
    printf("c[%d] = %f\n", i, ret[i]);
  }

  return 0;
}

AVX512 対応 gcc と binutils でコンパイルを行います. AVX512 命令を有効にする場合は -mavx512f オプションを付けます.

$ x86_64-unknown-linux-gnu-gcc-4.9.0 -S -mavx512f main.c

zmm レジスタを使う vaddps 命令が出力されているのを確認します

vaddps  %zmm1, %zmm2, %zmm0{%k1}

AVX512 対応 binutils でアセンブルしてバイナリを作ります.

$ as -o main.o main.s

$ gcc main.o

SDE で実行します. -knl フラッグを付けます.

$ sde64 -knl — ./a.out

 ./a.out                                                                        
c[0] = 32.000000
c[1] = 30.000000
c[2] = 28.000000
c[3] = 26.000000
c[4] = 24.000000
c[5] = 22.000000
c[6] = 20.000000
c[7] = 18.000000
c[8] = 16.000000
c[9] = 14.000000
c[10] = 12.000000
c[11] = 10.000000
c[12] = 8.000000
c[13] = 6.000000
c[14] = 4.000000
c[15] = 2.000000

期待する結果が出ましたね!

Happy AVX512 coding!

aobench on ZeroVM

動かすアプリが決まっている場合に有益そうな, 次世代の(アプリケーション?)仮想化プラットフォーム ZeroVM で aobench を動かせるようにして, どこでもセキュアに aobench を実行する可能性を検討してみましょう.
(ZeroVM の中身はアプリを NativeClient でビルドして sandbox 実行するのがキモのようです)

http://zerovm.org/wiki/The_Cloud_Hypervisor

検証環境

– Ubuntu 12.04.3 LTS

インストール

Ubuntu 12.04 LTS 用にはプレビルトバイナリがあるのでこれを活用します.

http://zerovm.org/wiki/Download

を参考に ZeroVM 環境やコンパイラをインストールします.


$ sudo apt-get install zerovm-zmq
$ sudo apt-get install zerovm-cli
$ sudo apt-get install zerovm-zmq-dbg
$ sudo apt-get install zerovm-zmq-dev
$ sudo apt-get install gcc-4.4.3-zerovm

Makefile などを流用するためにサンプルコードを取得します.

$ git clone https://github.com/zerovm/zerovm-samples

hello サンプルを参考に aobench サンプルを作ります.

$ cd zerovm-samples
$ cp -Rf hello aobench

Makefile をいじり適当にファイル名を aobench に変えます. -lm を加えて数学ライブラリをリンクするようにします. cat $(NAME).stdout.log の行を削除しておきます.

aobench の C コードを https://code.google.com/p/aobench/ などから取得します. ファイルに画像を出力しているところを stdout に出力するように変えます.

ビルド and 実行を行います.

$ make
$ cat aobench.stdout.log > ao.ppm
$ eog ao.ppm

aobench.stdout.log に結果が書かれているので, これを変換して aobench 画像が出れば成功です.

aobench-zerovm

Happy ZeroVM hacking!

qemu + binfmt + chroot で AARCH64 環境を構築する.

2014 年から ARM 64bit(AARCH64) な環境が普及されるのが見込まれています.

qemu を利用してお手軽かついち早く Intel x86 環境で AARCH64 環境を作り体験してみましょう.

検証環境 : Ubuntu 12.04.3 LTS(64bit)

qemu と binfmt パッケージをインストールします.


$ sudo apt-get install binfmt-support qemu

https://wiki.debian.org/Arm64Qemu から debian unstable のプレビルト chroot 環境をダウンロードして展開します.


$ sudo mkdir /src/chroots/debian-unstable-arm64
$ sudo tar -zxvf debian-unstable-arm64.tar.gz -C /srv/chroots/

/usr/share/binfmts/qemu-arm64 ファイルを作り以下の記述を行います.


package qemu-user-static
interpreter /usr/bin/qemu-arm64
flags: OC
offset 0
magic \x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7
mask \xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff


$ sudo update-binfmts --import qemu-arm64

として取り込みます.


$ sudo chroot /srv/chroots/debian-unstable-arm64
# uname -m
aarch64

と chroot 環境にログインできて aarch64 と表示されれば成功です.

ホスト環境から直接 AARCH64 バイナリを実行する

ダイナミックリンクバイナリをうまく実行できるようにホスト環境でシンボリックリンクを張っておきます.


$ sudo ln -s /srv/chroots/debian-unstable-arm64/lib/aarch64-linux-gnu /lib/
$ sudo ln -s /src/chroots/debian-unstable-arm64/lib/ld-linux-aarch64.so.1 /lib/

ホスト環境でクロスコンパイラを使ってバイナリを作成, 実行します.


$ cat main.c
#include
int
main(int argc, char** argv)
{
printf("Hello AARCH64!\n");
exit(0);
}

$ aarch64-linux-gnu-gcc main.c
$ ./a.out
Hello AARCH64!

なんとも普通のホスト環境(x86)のバイナリとして ARM64 なバイナリが実行できました. 開発が捗りますね! Happy AARCH64 coding!

TODO

– ユーザの管理はどうするか?
– HOME の共有はどうするか?
– クロスコンパイラ前提なら共有ライブラリ以外の chroot 環境は必要ない?

参考文献

– QEMUのもうひとつの使い方: ユーザーモードエミュレーションとbinfmtとchrootの組み合わせ http://blog.kmckk.com/archives/2342452.html

– Arm64Qemu https://wiki.debian.org/Arm64Qemu

– AARCH64 cross compiler https://launchpad.net/linaro-toolchain-binaries/