● x86で動作するある“g++で書かれたプログラム”を旧DECのAlphaマシーンで動かすのに悩んだ点
※ AlphaはHewlett-Packard Companyの登録商標です。


1. IEEE標準の浮動小数点に完全に準拠していないハードウェアのため、
   #define _GNU_SOURCE を使って NAN や INF を使っている場合、
   オプション -mieee を付けてコンパイルする必要がある。例えば、
g++ -O2 -W -mieee -lm hoge.cpp -o hoge
   これを忘れると、NAN 等を期待したところでAbortしてしまう。


2. Alphaにおいては、unsigned int は std::string::npos の値を格納する
   サイズがないため、変数 unsigned int var と std::string::npos は比
   較すると常に異なる値であるという結果となる。例えば、x86では正しく
   動くC++プログラムの一部:
std::string str("irohanihoheto");
unsigned int p;

while(1)
{
    p = str.find("12345");
    if (p == std::string::npos) break;
}
   は、Alphaでは無限ループに陥ってしまうか、Abortする。Alphaで動く
   ようにするには、
std::string str("irohanihoheto");
unsigned long int p;

while(1)
{
    p = str.find("12345");
    if (p == std::string::npos) break;
}
   のように unsigned long int 型にする必要がある。

   ともかく、integerは long にしておくのが無難である。


3. Alpha固有の問題ではないが、中には、namespace std の中の関数はいつも
   関数名だけで使えると仮定して作成されたプログラムもある。(特に cout、
   さらにvector系の関数の使用にこの過ちが多い。) g++-3.xからは厳しくな
   ったので、
using namespace std;
   を使用してごまかす。

   また、 friend A; と class を抜かした書き方が見られることもある。
friend class A;
   に直しておく。


4. これもAlpha固有の問題ではないが、一般に変数や配列要素は 0 や 0.0 を初
   期値に持つとは限らない。x86上で動くg++は初期値に何も指定しなくても勝手に要
   素が 0 や 0.0 の配列やベクトルを生成する癖がある。これに依存してコードを書
   いていた場合、同じコードをAlpha上のg++でコンパイルすると、配列やベクトルの
   各要素の初期値が NAN や -NAN になることが多いから注意すべきである。

   特に、他人が作った行列計算用のクラスを使用する場合、各要素が正しく初期化され
   ているかどうか検証すべきである。往々にしてコンストラクターで初期化を忘れてい
   て、計算結果が NAN ばかりであったり例外が発生して計算が止まったりする。



Alphaはリトルエンディアンであるし、それほど労せずともプログラムを動作させることは出来る。

戻る