アライメント(128bit境界)PlayStation? 2では、そのアーキテクチャの仕様から、 128bit境界でデータを 配置する必要がある場合があります。変数宣言した場合は、コンパイラが便宜 を図ってくれるので問題は無いのですが、malloc系の関数を使って動的にメモ リを確保した場合、128bit境界に合わない場合があります。そのため、128bit 境界に合わせる必要があるデータを動的に確保する場合は、境界に合っている かをチェックして、ずれているならば合わせる処理を行わなければなりません。 bus errorが出た場合、このアライメント問題の可能性が高いです。 だからアラインメントってなによ?これ読んでちょ アライメントに気を配る必要のあるもの本当は、マニュアルを読んだり、ライブラリを見たりして、判断する方が良い のですが、簡単な見分け方を紹介しておきましょう。 アライメントに気を配る必要があるのは、 typedef int ps2Samp0IVECTOR[4] __attribute__((aligned (16))); といった感じで、定義に __attribute__( (aligned (16) ) )の オプションが付いているものです。 本研究室のライブラリ等を使用していれば、この問題を気にする必要は少なく なるでしょう。 アライメントの調整方法128bit境界に合わせつつ、メモリを動的に確保する(mallocする)プログラムの 例を、以下に示します。 /* どっかにこんな感じのベクタ型が定義されている */ typedef int ps2Samp0FVECTOR[4] __attribute__((aligned (16))); . . . ps2SampOFVECTOR *align = memalign(16,sizeof(int)*4); ここでのポイントは、以下の通り。
|