ubuntu-amd64を使う

2009-11

使ってみた感想。

  • とりあえず使ってみる。
    main() {printf("Hello");}
    $ gcc -O2 main.c
    $ objdump -S a.out
  • するとこんな感じ。
    0000000000400460 <_start>:
     400460:       31 ed                   xor    %ebp,%ebp
     400462:       49 89 d1                mov    %rdx,%r9
     400465:       5e                      pop    %rsi
     400466:       48 89 e2                mov    %rsp,%rdx
     400469:       48 83 e4 f0             and    $0xfffffffffffffff0,%rsp
     40046d:       50                      push   %rax
     40046e:       54                      push   %rsp
     40046f:       49 c7 c0 70 05 40 00    mov    $0x400570,%r8
     400476:       48 c7 c1 80 05 40 00    mov    $0x400580,%rcx
     40047d:       48 c7 c7 50 05 40 00    mov    $0x400550,%rdi
     400484:       e8 c7 ff ff ff          callq  400450  <__libc_start_main@plt>
     400489:       f4                      hlt
     40048a:       90                      nop
     40048b:       90                      nop
  • 64bit長げー。(それが感想か?)

嘘。

ubuntu-amd64のよい点。

  • 大抵の実行ファイルを実行できる。
    • Win32Console EXE / Win32 GUI EXE / 32bit i386 elf / x86_64 elf
  • 64bit版だからレジスタが実質6本(eax,edx,ecx,ebx,esi,edi)から、14本に増えたから、elfが速いかもしれない。(未計測)
  • ConsoleがWin32よりまとも。

ubuntuのだめな点。

  • mp3とかmpegを再生できない。(何それ)
    • 適切なコーデックが無かったり、自動で入れてくれたやつがだめだったり。
  • ---> vlc player を入れると一応再生出来るようになります。
    # apt-get install vlc
  • 字(フォント)が微妙に汚い。
  • まあたぶん、使い慣れたWindowsと比べて、各種のレンダリングエンジンやらフォントが異なるので、配置がずれて気持ちが悪いとか、OpenOfficeでも以下同様。
  • 慣れの問題
  • 漢字変換がダメダメ。
  • DVDが焼けない。(焼くためのフリーソフトはあるんだけど、デバイスがエラーして1枚焼き損じた。)

しかし、昔に比べるとだいぶ良くなっている。

  • マルチメディア系に目をつぶれば、何とか使える。
  • とりあえず困らない。
    • MPLABのC18のインストーラーが普通に動いて、mcc18.exeのインストールが完了する。
    • mchip-cdc.zipをそのままビルド出来る。
  • 全くもって問題なしなので、Windows要らない。

64bit Linuxは(32bit版に比べて)速いのか?

  • 否。
    • ---> 64bitにすると微妙に速い。でも微妙(数%程度)
    • 整数レジスタが14本になり、関数引数がほぼレジスタ渡しになるので少しだけ速くなる(?)
    • しかし、ポインタサイズが無駄に長い(64bitになるが実際に使用するアドレスはせいぜい40bit程度)ので命令長やデータアクセスのバンド幅を無駄に消費する。
    • Atomでは64bitモードで逆に遅くなるという話。64bitレジスタはあってもALUが32bitだとか(?)ありがち。未検証。
    • AMD64とintel x86_64は(一応)互換性はあるのだが、最適化方法が異なるのでx86_64のバイナリーをAthlon64で動作させると速度的に不利らしい。(未検証)
  • intel様は、Core2アーキテクチャーの設計時に32bitモードでの最適化のほうを選択した。
  • 命令デコーダの並列度は32bitモードで最適になるように設計されたが、64bitモードでは命令長が伸びるため、1クロックでデコード可能な命令数が(32bitモードと比べて)少なくなる。
  • Core2を高速にしている特長の一つ、microOP fusion は32bitモードでしか有効になっていない。
  • レジスタ数が8->16に増えた反面、命令プリフィックス(REX)が必要となってコードサイズや命令デコードの手間が増える。
  • アドレスフィールドが64bitに増えるのでプログラムサイズが肥大化し、そのぶん命令キャッシュ、データキャッシュも効きが悪くなる。

但し、64bit整数演算を多用する場合は断然64bit-elfのほうが速くなるのでそこは工夫次第。






番外編:g++(gcc)のコンパイル速度を比較する。

Celeron E32003.20GHz(OC)64bit Linuxreal 0m53.769suser 0m49.480ssys 0m5.010s
Core2 E66002.40GHz64bit Linuxreal 0m56.939suser 0m52.870ssys 0m5.190s
Core2 E66002.40GHz32bit Linuxreal 1m1.912suser 0m58.388ssys 0m3.660s
Celeron E32002.40GHz64bit Linuxreal 1m7.561suser 1m2.770ssys 0m5.590s
Athlon64 X2 4200+2.20GHz64bit Linuxreal 1m26.263suser 1m19.380ssys 0m8.220s
Athlon64 X2 4200+2.20GHz32bit Linuxreal 1m25.029suser 1m19.977ssys 0m6.004s
  • 面倒なのでグラフ化はしていません。
  • Linuxは全部ubuntu9.10です。
  • g++-4.4.1です。
  • ビルドに使用したソースはHTエディタです。(C++で記述され、丁度1分程度でビルド完了します)
  • 計測方法は、
    $ make clean
    $ time make
    これを2回実施し、2回目の値を貼り付けています。(ディスクアクセスを極力キャッシュさせて影響を減らすため)


  • Celeron DualCore(E3200)は4500円程度で売られています。同クロックのCore2Duo比で2割弱遅いです。
  • Athlon64ではどうかというと、同クロックのCore2Duo比(換算して比較)で4割程遅いです。
  • E3200のOC性能が奮わないのは、メモリーが追いつかないのでメモリークロックを落としているためです。
  • また、E6600はDDR2をデュアルチャネルで動作させていますが、E3200のほうはシングルチャネルしか挿していません。