VirtualBox のゲスト OS が Debian の場合に共有フォルダを自動でマウントしたかったが /etc/fstab の読み込み時には vboxsf がまだ使えないようなので /etc/rc.local で共有フォルダをマウントするようにした。たとえばホスト OS の共有フォルダ share を /mnt/share にマウントするには mount -t vboxsf share /mnt/share を /etc/rc.local に追記すればよい。
参考:
http://blog.goo.ne.jp/j_adversaria/e/9eace0f5c9a27066ce6121fd895d8192
2014年2月23日日曜日
2014年2月7日金曜日
rotate_left_shift(x, 1) - x の最適化
uint32_t x に対して掲題の計算を行いたい。
rotate shift 命令のないプロセッサの場合は
を計算することになり四命令 (<<, |, >>, +) が必要となる。しかしこの演算は
と等価であるので後者であれば二命令 (>>, +) で実現できて効率が良い。
実際に等価である事は次のようにして確認できる。基本的なアイデアは x を上位 1 bit と下位 31 bit に分けて考えることである。
演算子 | の左右の有効ビットは左が上位 31 bit で右が下位 1 bit であるので重なりがない。よって | を + に置き換えられる。
((x << 1) + (x >> 31)) - x
加法は結合法則と交換法則を持つので外側の括弧を外して演算の順序を入れ替えても良い。
(x << 1) - x + (x >> 31)
真ん中の x を下位 31 bit と上位 1 bit に分ける。
(x << 1) - (x & 0x7FFF FFFF) - (x & 0x8000 0000) + (x >> 31)
前の二項は x の下位 31 bit の二倍から x の下位 31 bit を引いたものなので x の下位 31 bit に等しい。
(x & 0x7FFF FFFF) - (x & 0x8000 0000) + (x >> 31)
最上位ビットのみの数値の引き算は足し算と等しい。
(x & 0x7FFF FFFF) + (x & 0x8000 0000) + (x >> 31)
前の二項は x そのものである。
x + (x >> 31)
rotate shift 命令のないプロセッサの場合は
((x << 1) | (x >> 31)) - x
を計算することになり四命令 (<<, |, >>, +) が必要となる。しかしこの演算は
x + (x >> 31)
と等価であるので後者であれば二命令 (>>, +) で実現できて効率が良い。
実際に等価である事は次のようにして確認できる。基本的なアイデアは x を上位 1 bit と下位 31 bit に分けて考えることである。
演算子 | の左右の有効ビットは左が上位 31 bit で右が下位 1 bit であるので重なりがない。よって | を + に置き換えられる。
((x << 1) + (x >> 31)) - x
加法は結合法則と交換法則を持つので外側の括弧を外して演算の順序を入れ替えても良い。
(x << 1) - x + (x >> 31)
真ん中の x を下位 31 bit と上位 1 bit に分ける。
(x << 1) - (x & 0x7FFF FFFF) - (x & 0x8000 0000) + (x >> 31)
前の二項は x の下位 31 bit の二倍から x の下位 31 bit を引いたものなので x の下位 31 bit に等しい。
(x & 0x7FFF FFFF) - (x & 0x8000 0000) + (x >> 31)
最上位ビットのみの数値の引き算は足し算と等しい。
(x & 0x7FFF FFFF) + (x & 0x8000 0000) + (x >> 31)
前の二項は x そのものである。
x + (x >> 31)
2014年2月2日日曜日
Ubuntu/x86 で NEON のコードをクロスコンパイルして実行する
必要な作業は以下の三つ。
のようなコードを書いてビルドする。
QEMU の実行には root 権限が必要なこととターゲットのライブラリパスを指定する必要があることに注意する。
- クロスコンパイル環境を構築する
- QEMU を入れる
- NEON のコードを書いて実行する
クロスコンパイル環境を構築する
$ sudo apt-get install g++-arm-linux-gnueabi binutils-arm-linux-gnueabi
QEMU を入れる
$ sudo apt-get install qemu
NEON のコードを書いて実行する
#include <stdio.h> #include <stdint.h> #include <arm_neon.h> int main(int argc, char* argv[]) { uint32_t src[] = {0, 1, 2, 3, 4, 5, 6, 7}; uint32_t dst[4]; uint32x4_t i0 = vld1q_u32(src); uint32x4_t i1 = vld1q_u32(src + 4); uint32x4_t i2 = vaddq_u32(i0, i1); vst1q_u32(dst, i2); for (size_t i = 0; i < sizeof(dst)/sizeof(*dst); ++i) { printf("%d ", dst[i]); } return 0; }
のようなコードを書いてビルドする。
$ arm-linux-gnueabi-g++ -mfpu=neon -mfloat-abi=softfp test.cpp
QEMU の実行には root 権限が必要なこととターゲットのライブラリパスを指定する必要があることに注意する。
$ sudo qemu-arm -L /usr/arm-linux-gnueabi/ a.out 4 6 8 10
登録:
投稿 (Atom)