月別アーカイブ: 2009年9月

NetWalker PC-Z1 Cortex-A8 (ARM) 浮動小数演算の実行速度

先日のテストでは Atom に匹敵する実行速度を出していながら、浮動小数演算では
大きく差をつけられる結果となりました。
もう少し詳しく調べたところ、いろいろわかってきました。

結論は
・VFP が遅い
・NEON の SIMD 2/4 を使えばかなり速い
・NEON の単精度スカラー同士の演算は VFP なので遅い

今回は直接命令毎の実行速度を測ってみます。例えば整数乗算なら下記のような感じで。
省略していますが実際には mul 命令を 40 個並べています。
これを 100M 回 (1億) ループします。

static void Start_ASMINT_MUL()
{
    TimerClass  timer;
    timer.Begin();

    __asm__ __volatile__( "\
        mov  r2, #123  \n\
    " : : : "r2","cc" );

    for( int i= 0 ; i< VECTOR_LOOP ; i++ ){
        __asm__ __volatile__(
        "\
            mul	r3, r2, r2 \n\
            mul	r3, r2, r2 \n\
              ~
        " : : : "r3","cc" );
    }

    timer.End( "ASMINT_MUL" );
}

各種演算命令を並べてテストした結果が下記の通りです。
4000M 命令の実行時間の実測値 (秒) です。

i.MX515 Cortex-A8 (ARM) 800MHz
命令                 実行時間        演算ユニットと演算単位
---------------------------------------------------------------
mul  r,r,r           10.21 sec       ALU   32bit
add  r,r,r            5.16 sec       ALU   32bit
fmuls  s,s,s         50.45 sec       VFP   32bit
fadds  s,s,s         45.45 sec       VFP   32bit
fmuld  d,d,d         55.49 sec       VFP   64bit
vmul.f32  s,s,s      50.45 sec       VFP   32bit
vmul.f32  q,q,q      10.07 sec       NEON 128bit (32bit x4)
vadd.f32  q,q,q      10.08 sec       NEON 128bit (32bit x4)
vmla.f32  q,q,q      10.09 sec       NEON 128bit (32bit x4) 積和
vmul.f32  d,d,d       5.04 sec       NEON  64bit (32bit x2)

命令はパイプラインがストールしないよう、意味がないけど依存が発生しない組み合わせで
並べています。

整数演算は mul でおよそ 392M命令/sec です。add の場合は 775M 命令なので、
ほぼ 1命令/cycle に近い数値で実行出来ていることがわかります。

問題の VFP による浮動小数演算は乗算で 5倍、add 比で 9倍も遅くなっています。
倍精度の乗算でも 10% ほどしか増えていないので、オーバーヘッドは別のところに
あるのかもしれません。
丸めモードや Flush-to-Zero モードなど、FPSCR も書き換えてみましたが結果は同じでした。
なお乗算する値が 0 の場合のみ、fmuls は 3割ほど速い速度で完了します。

対照的に NEON がかなり高速です。4要素(128bit) の SIMD 演算であるにもかかわらず
整数演算と同速度で実行しており、2要素(64bit) の SIMD の場合はむしろ整数演算よりも
高速です。ほぼ 1cycle 毎に 2 float の演算をしています。
さらに積和演算が可能なので、SIMD で vmla を用いた場合

40命令 × 100Mループ × 4 (SIMD) × 2 (積和) / 10sec = およそ 3.2G FLOPS

となります。

ではなぜ普通にコンパイルしたプログラムの浮動小数演算が遅いのかと言えば、NEON の
スカラー演算命令は VFP と共有されているからです。
sレジスタ を用いた演算は、NEON ではなく VFP で実行されます。
実際に vmul.f32 s,s,s は fmuls s,s,s と全く同じバイトコードでした。
コンパイラは一般の浮動小数演算では VFP 命令を出力しています。

結局最初に書いたとおり VFP が非常に遅いという結論になります。
そのためスカラー演算であっても 2/4 ベクタとみなして NEON 命令を使った方が
高速になるわけです。
例えば fmuls s,s,s → vmul.f32 d,d,d なら 10 倍です。

実際のアプリケーションで使ったわけではありませんが、周辺を考えなければ Atom 比でも
結構良い結果になるのではないでしょうか。
これが iPod touch 3G/iPhone 3GS の大きさにも収まっていると考えればなおさらです。

vmla は破壊代入するため、他の命令のように同じオペランドのまま並べると依存が発生して
ストールします。5倍ほど遅くなるので、このテストでは代入側レジスタを 5個用いて
インターリーブしています。quad 時スループット 2 のレイテンシ 10 くらいでしょうか。

関連エントリ
NetWalker PC-Z1 Atom と速度比較
NetWalker PC-Z1 Bluetooth とキーカスタムその他
NetWalker PC-Z1 意外にいける
Netwalker PC-Z1 買いました
タッチタイプの境界
NetWalker PC-Z1

NetWalker PC-Z1 Atom と速度比較

Atom と比べてみました。
あくまで参考程度でお願いします。

  ALU    FPU    MEM1   MEM4
  9.32   5.17   4.24   3.20     (1)  Core i7 920 2.67GHz
 29.41  29.36  43.83  27.43     (2)  Atom Z540 1.86GHz
 68.68  68.73  46.70  36.45     (3)  Atom Z540 800MHz
 42.88  44.09  39.45  20.03     (4)  Atom N270 1.60GHz
 37.82 209.76  56.35  30.68     (5)  Cortex-A8 800MHz NEON
 37.84 209.79  58.17  30.69     (6)  Cortex-A8 800MHz VFP
 37.83 252.80  56.34  30.75     (7)  Cortex-A8 800MHz soft
 42.96 211.02  55.86  30.52     (8)  Cortex-A8 800MHz NEON + Thumb-2
 42.85 212.18  55.87  30.53     (9)  Cortex-A8 800MHz VFP + Thumb-2
 42.92 267.23  55.84  30.54     (10) Cortex-A8 800MHz soft + Thumb-2

単位は秒、値が小さい方が高速

テストは基本的にただのループかつシングルスレッドのみです。
数値は Real Time なので厳密なコードのみの実行速度ではないです。

ALU 全部キャッシュに収まる整数演算とループ
FPU スカラーの浮動小数演算を含んだループ
MEM1 8bit 単位のメモリアクセス
MEM4 32bit 単位のメモリアクセス

(5)~(10) が NetWalker です。
浮動小数演算以外はほぼ Atom と近い範囲で、クロック差があるにもかかわらずかなり
善戦しています。おそらく整数演算に関してはシングルスレッドかつキャッシュに入る場合、
同クロックの Atom よりも高速です。

ただし実際の動作速度は CPU core の速度だけでなく、メモリや SSD 等他のデバイスの
影響が大きいので、これだけで判断することは出来ません。

また Atom は HT 前提のパイプライン設計なので、シングルスレッドではその性能を
出し切れていないともいえます。
同じように (1) の Core i7 も 8 スレッドのうち 1つだです。ちなみに (1) は
同時に VirtualBox の仮想 PC が動いていたりとかなりの悪条件で走らせました。

計測も Real 時間なので、バックグラウンドで動いているタスクの影響を少なからず
受けているといえます。この場合 HT を持っている Atom の方が若干有利に働くかも
しれません。

(3) は Z540 の電源設定を変更して、上限 800MHz で動かしたものです。
ALU FPU 時間はクロック数に比例して遅くなりました。MEM1/MEM4 はそれほど変化が
ないようです。この点から MEM1/4 の実行速度は CPU core の速度度よりも、メモリ
アクセス時間の割合の方が大きいと考えられます。

(2)/(3) と (4) はクロック比と速度が一致していません。これはおそらくコンパイラ
の差です。最適化の傾向が異なっており、ループ内の演算に無駄があり畳み込める
条件では gcc の方が高速でした。また VC は SSE 命令を使っており、gcc は
-msse4 をつけても FPU 命令に展開されています。

MEM1 は 1byte 単位で 32MByte を読み書きしています。
MEM4 は 4byte 単位で 64MByte アクセスしています。
よってループ回数は MEM4 が半分になります。
(4) の結果を見ると MEM4 は MEM1 のちょうど半分の時間で完了しているので、
このテストではデータサイズが速度に影響を与えていないようです。

浮動小数演算はただのスカラー演算です。遅すぎて、設定ミスとか例外が発生してるの
ではないかと疑いました。一応 vfp,neon,soft と 3通り試しています。
取りあえずエミュレーションよりは速いことがわかります。
きちんと SIMD を活用すれば、もう少しそれなりの速度が出るのかもしれません。

Thumb-2 の効果は確認できました。16/32bit 命令が混在しており、FP 命令呼び出しも
特に速度が落ちていないようです。

浮動小数演算以外は思ったよりも速いです。浮動小数演算が著しく遅いのは、
プログラムのミスなのかまだ良くわかっていません。

ARM の浮動小数演算に関しては下記ページを参考にさせていただきました。
ひまじめ 組み込みLInux

(2009/09/30 追記) 続き>> NetWalker PC-Z1 Cortex-A8 浮動小数演算の実行速度

(1) PC
Core i7 920 2.67GHz
Windows7 RTM x64, VC2008 x86 -arch:SSE2

(2) VAIO type P
Atom Z540 1.86GHz
Windows7 RC x86, VC2008 x86 -arch:SSE2

(3) VAIO type P
Atom Z540 1.86GHz (800MHz)
Windows7 RC x86, VC2008 x86 -arch:SSE2

(4) EeePC 901
Atom N270 1.6GHz
Ubuntu 9.04 x86, gcc-4.3.3 -mssse3

(5) NetWalker PC-Z1
i.MX515 Cortex-A8 800MHz NEON
Ubuntu 9.04 armel, gcc-4.3.3 -mfloat-abi=softfp -mfpu=neon

(6) NetWalker PC-Z1
i.MX515 Cortex-A8 800MHz VFP
Ubuntu 9.04 armel, gcc-4.3.3 -mfloat-abi=softfp -mfpu=vfp

(7) NetWalker PC-Z1
i.MX515 Cortex-A8 800MHz soft
Ubuntu 9.04 armel, gcc-4.3.3 -mfloat-abi=soft

(8) NetWalker PC-Z1
i.MX515 Cortex-A8 800MHz NEON + Thumb-2
Ubuntu 9.04 armel, gcc-4.3.3 -mfloat-abi=softfp -mfpu=neon -mthumb

(9) NetWalker PC-Z1
i.MX515 Cortex-A8 800MHz VFP + Thumb-2
Ubuntu 9.04 armel, gcc-4.3.3 -mfloat-abi=softfp -mfpu=vfp -mthumb

(10) NetWalker PC-Z1
i.MX515 Cortex-A8 800MHz soft + Thumb-2
Ubuntu 9.04 armel, gcc-4.3.3 -mfloat-abi=soft -mthumb

(2009/09/30 追記) 続き>> NetWalker PC-Z1 Cortex-A8 浮動小数演算の実行速度

関連エントリ
NetWalker PC-Z1 Bluetooth とキーカスタムその他
NetWalker PC-Z1 意外にいける
Netwalker PC-Z1 買いました
タッチタイプの境界
NetWalker PC-Z1

GeForce ドライバ 191.03 beta

GeForce のドライバ 191.03 (beta) が出ています。
やっと OpenGL 3.2 と Compute Shader 4.0 の共存が出来るようになりました。
どちらも動いています。

GEFORCE/ION DRIVER RELEASE 191

この辺 RADEON はまだ対応していませんが、すでに DirectX11 が動く 5870 が発売されました。
ShaderModel とか Compte Shader の対応とか非常に興味あるけど
週末 RADEON HD 5870 はすでに売り切れでした。

関連エントリ
OpenGL や GLSL の互換性
Direct3D11/DirectX11 GeForce の ComputeShader とドライバ

NetWalker PC-Z1 Bluetooth とキーカスタムその他

●Bluetooth

Bluetooth アダプタ Princeton PTM-UBT3S, PLANEX BT-Mini2EDR を使ってみました。

・システム → システム管理 → Synaptic パッケージマネージャー
・gnome-bluetooth をインストール指定 → 適用
・いったんログアウトして再ログイン

アダプタを接続すると通知スペースに Bluetooth のアイコンが表示されるので
そこからペアリング等を行います。または システム → 設定 → Bluetooth 。

ペアリングしたもの。
マウス SONY VGP-BMS33, キーボード REUDO RBK-2100BTJ

二回ほどサスペンド後にアダプタを認識してないことがありましたが、
電源入れ直し等で復活。以降は今のところ動いています。

●キーボード

購入時からキーボードの配列のカスタマイズを考えていました。
本当は uinput を使いたいのですが module uinput.ko が無かったので取りあえず
xmodmap を使います。

$ xmodmap -pke > $HOME/.Xmodmap

以降 .Xmodmap の書き換えでキー配列の入れ替えができます。
書き換えた内容はログインし直しで適用されるはずです。
その場で確認するなら

$ xmdomap $HOME/.Xmodmap

上のコマンド実行だけだとサスペンド後に配列が戻ってしまいます。
再ログインしておけばサスペンド後も有効となります。
$HOME に .Xmodmap で始まるファイルが複数ある場合、ログイン時にどれを用いるか
選択画面が出ます。

実際に設定してみます。
例えば [/?] (61) と [;+] (47) を入れ替えるなら 61 と 47 を交換します。

!keycode  47 = semicolon plus semicolon plus semicolon plus
keycode  61 = semicolon plus semicolon plus semicolon plus

!keycode  61 = slash question slash question slash question
keycode  47 = slash question slash question slash question

Shift や Control キーを入れ替える場合はモディファイヤの再登録が必要です。

[ J ][ K ][ L ][/? ][Ent]
 [ M ][<,][>.][ ↑ ][Sft]

  ↓

[ J ][ K ][ L ][;+ ][Ent]
 [ M ][<,][>.][ /? ][ ↑]

例えば内蔵キーボードの右下部分を上記のように並べ替えるには

! ファイル先頭で remove
remove shift = Shift_R

!keycode  47 = semicolon plus semicolon plus semicolon plus
keycode  61 = semicolon plus semicolon plus semicolon plus

!keycode  61 = slash question slash question slash question
keycode  111 = slash question slash question slash question

!keycode  62 = Shift_R NoSymbol Shift_R NoSymbol Shift_R
keycode  47 = Shift_R NoSymbol Shift_R NoSymbol Shift_R

!keycode 111 = Up NoSymbol Up NoSymbol Up
keycode 62 = Up NoSymbol Up NoSymbol Up

! ファイル最後で add し直し
add shift = Shift_R

●キーボードカスタマイズ uinput

User Input を利用するとプログラムでキーの挙動をカスタマイズすることが可能です。
下記のページを参考にさせていただきました。

Linux Input Subsystemの使い方

x86 PC の Ubuntu 上で試してみました。
入力を遅延判定させた場合のバッファリングとかそのフラッシュなど、Windows /
WindowsMobile 上で ctrlswapminiem1key を作っていたときとほとんど同じ感覚です。
おそらく同等のプログラムの移植も可能だと思います。
日本語入力の状態が取得できれば親指シフト入力も対応できるでしょう。

(2009/10/03 追記: 親指シフトについてはこちらをどうぞ)

NetWalker 向けのプログラムも作ったのですが uinput が使えずまだ試しておりません。
実際のプログラム例は下記の通りです。
これは [A] と [B] を交換するだけです。サンプルにあった hook_main.c/.h をそのまま
使わせていただきました。hook_main.c をリンクするだけで動作します。

// swap_AB.c
// swap_AB /dev/input/event*
#include  
#include  
#include  
#include  
#include  "hook_main.h"

const char*  name= "swap_AB";
const char*  version_information= "swap_AB";
const char*  description= "swap_AB";

static int   keyboard_fd= 0;

void* init_event_handler( int number_of_event_device_files, int* event_fds )
{
    ioctl( keyboard_fd= *event_fds, EVIOCGRAB, 1 );
    return  NULL;
}

void finalize_event_hander( void* user_data )
{
    ioctl( keyboard_fd, EVIOCGRAB, 0 );
}

void handle_event( int fd, struct input_event event, void* user_data )
{
    int	vk= event.code;
    if( event.type == EV_KEY ){
        switch( vk ){
        case KEY_A:
            vk= KEY_B;
            break;
        case KEY_B:
            vk= KEY_A;
            break;
        }
    }
    send_event( event.type, vk, event.value );
}

void set_event_bits( int ui_fd )
{
    int	i;
    ioctl( ui_fd, UI_SET_EVBIT, EV_KEY );
    for( i= 0 ; i< 256 ; i++ ){
        ioctl( ui_fd, UI_SET_KEYBIT, i );
    }
}

●その他気がついたことなど

最初すぐにバッテリーが減ったように見えるけど、ステータスでは「バッテリー容量:中」。
容量とアイコンの見た目が合っていません。

フラッシュメモリの容量は 4GB ですが、初期状態の空きはおよそ 2.7GB でした。
カタログには「ユーザーエリア 2GB」と書かれているので若干余裕があります。

RAM 容量は 512MB、利用可能な空間は 480MB。
Firefox、ドキュメントビューア、コンソールを起動して消費メモリは 200MB くらい。
ページを複数開いてもまだまだ大丈夫です。

「パネルへ追加」から「CPU 周波数の計測モニタ」を追加してみました。
CPU クロックはピーク時 800MHz で、アイドル時は 160MHz まで落ちているようです。

上パネルの時計の設定から都市を登録しておくと天気や温度も表示されます。

[Fn]+[8] で画面のバックライトだけ消すことが可能です。

黒い色を買ったせいか汚れは結構目立ちます。
ストラップをつけられるのは便利です。手でもって使う場合も安心。

仕様一覧によるとフレームバッファは 16bit 65536色です。

関連エントリ
NetWalker PC-Z1 意外にいける
Netwalker PC-Z1 買いました
タッチタイプの境界
NetWalker PC-Z1

NetWalker PC-Z1 意外にいける

二日ほど使った感想は「結構良い」です。
意外といったら失礼かもしれませんが、いろいろな面で見直しました。

●両手で持つ

前回書いたとおりネット接続はあまり考えてなかったのですが、使ってみたらこれが快適でした。
無線 LAN さえあれば立っていても横になった状態でも楽にブラウズできます。

・両手持ちしたときちょうど良い位置にあるオプティカルポイント。ほぼこれだけで操作できる。
・ちょっとした検索文字列の入力なら十分役に立つキーボード。
・小さいけど十分な解像度の液晶画面もあるしフォントも見やすい。
・NetBook より軽量で持ち上げられる。
・熱も持たずにバッテリーの持ちも良い。
・中断も DS のようにふたを閉じるだけ。電源を入れるとすぐに復帰する。

電車内でもモバイルルータ併用で立ったまま使ってみました。これも思いのほか使いやすい。
Firefox でネットを見たり、電波の届かない地下鉄区間もメモ打ちしたりと便利に使えます。

以前使っていたスマートフォンで、親指タイプには苦手意識がありました。
W-ZERO3[es] や EM・ONE は、クリック感はあるものの小さくて堅い QWERTY キーで、
爪で押す必要があったり、ボタンが浅いので隣のキーを押してしまうことも多かったからです。
逆に W-ZERO3[es] のテンキー部分は指で押せる大きさで打ちやすいものでした。

同じように NetWalker のキーも指の腹で押せるし、親指ならぐらつくキートップでも確実に
打てるため、それなりに使いやすいことがわかりました。
キーを押し下げた場合の感触はいまいちで引っかかりがあるけれど、親指打ちも結構いけるんだと、
今更ながら気がついたというのが本音です。

ただ両手持ちの親指打ちだと、中央付近のキーは少々遠く感じます。
端ぎりぎりまでキーがあるし Fn や Ctrl を併用する操作は慣れがいるかもしれません。
親指タイプとタッチタイプの両用を欲張ったための弊害でしょう。

この辺の操作は今後のカスタマイズで何とでもなると思います。
むしろ変にメーカー固有のカスタマイズが入ってない素のパソコンキーボード状態なのは
好ましいことです。

●オプティカルポイント

マウス代わりに用いるデバイスです。
タッチパッドのように指でスライドしてカーソルをコントロールします。
反応が良くてきびきび動いてくれます。

PC-NJ70A の光センサー液晶パッドは反応が悪くて使いづらかったので、なおさらそう感じる
のかもしれません。また比較対象があれですが、PS3 ワイヤレスキーパッドのタッチパッド
モードより思い通りに動かせます。

デフォルト状態では少々カーソルの動きが速すぎる感じがします。ウィンドウの切り替えや
ダイアログのボタン、ブラウザの操作は快適なのですが、小さいアイコンやスクロールバーに
正確にあわせるのは苦手です。
使うアプリケーションや用途次第だと思いますが、個人的にはブラウザの操作だけなら
これで十分でした。

設定でマウスの速度や感度を多少いじっています。間違って「☆」マークに触れてしまうと
誤動作するので、スクロールモードに切り替わらないようこちらも封印しています。

●アプリケーション

開発環境を用意したり、アプリストアを設けたり、最近そういう試みが増えた気がします。
携帯 OS に限らずありとあらゆるプラットフォームで。
開発側、使う側、両方の敷居を下げる意味があるのでしょう。
iPhone のような盛り上がりをどこか期待している反面、専用アプリを用意しなければいけない
と言う現実問題がそこにあるのかもしれません。
結局開発者に投げてしまっているわけで、実際にアプリケーションがどれだけ充実するのか未知数です。

NetWalker は普通の Linux を採用したおかげで最初から豊富なアプリケーションが揃っています。
インストールも一覧から選択するだけで簡単です。
以前 WindowsCE の Handheld PC を使っていた頃も使えるアプリケーションソフトが限られて
いました。Desktop 向け Windows がそのまま動くなら何の心配もないのですが。

もう1つの利点は削除された機能がないことです。
モバイル向けの移植ではないので、操作や機能が簡略化されていたり、削られているような
ことがありません。

MID としてみたら上記 2点はメリットですが、UMPC としてみたらこれらはごく当たり前の
ことかもしれません。
そういう意味では NetWalker は MID のカテゴリとして売られているけど、
実質 ARM を使った UMPC の一種だと言えます。

●キーボード

個性だと割り切っています。

●最後に

NetBook が流行し多くの機種が販売されていますが、どれも EeePC に倣ったかのような
画一的なスペックで意外に個性がないように見えます。おそらくコストの事情もあるのでしょう。
本当なら用途を特定したような、もっとユニークなデバイスが登場しても良さそうです。
ASUS のキーボード一体型みたいな。

MID / UMPC にはまだお手本となる大ヒット機種がないせいか、比較的個性を出しやすいようです。

NetWalker を店頭で熱心に見ていると、店員が「おすすめしづらい」製品だと漏らしていました。
過去の経験に当てはまらず具体的な用途を想像しづらいのかもしれません。
「今まで無かった新しいもの」 かまたは 「本当に用途がわからないもの」 のどちらかでしょう。
うまく説明できないものこそ新しいジャンルを切り開く可能性もありますが
果たして NetWalker はどちらになるでしょうか。

個人的にはスマートフォンの機動性を確保しつつ十分使えるパソコンだと認識しました。

関連エントリ
Netwalker PC-Z1 買いました
タッチタイプの境界
NetWalker PC-Z1