アライメントの問題

アライメントの問題

# アライメント(128bit境界)

PlayStation 2では、そのアーキテクチャの仕様から、 128bit境界でデータを 配置する必要がある場合があります。変数宣言した場合は、コンパイラが便宜 を図ってくれるので問題は無いのですが、malloc系の関数を使って動的にメモ リを確保した場合、128bit境界に合わない場合があります。そのため、128bit 境界に合わせる必要があるデータを動的に確保する場合は、境界に合っている かをチェックして、ずれているならば合わせる処理を行わなければなりません。 COLOR(orange){bus error}が出た場合、このアライメント問題の可能性が高いです。

# だからアラインメントってなによ?

これ読んでちょ

アライメントとか、ワード境界とか

# アライメントに気を配る必要のあるもの

本当は、マニュアルを読んだり、ライブラリを見たりして、判断する方が良い のですが、簡単な見分け方を紹介しておきましょう。 アライメントに気を配る必要があるのは、

typedef int ps2Samp0IVECTOR[4] __attribute__(aligned (16));

といった感じで、定義に COLOR(orange){ attribute( (aligned (16) ) ) }の オプションが付いているものです。 本研究室のライブラリ等を使用していれば、この問題を気にする必要は少なく なるでしょう。

# アライメントの調整方法

128bit境界に合わせつつ、メモリを動的に確保する(mallocする)プログラムの 例を、以下に示します。

/* どっかにこんな感じのベクタ型が定義されている */
typedef int ps2Samp0FVECTOR[4] __attribute__(aligned (16));
.
.
.
ps2SampOFVECTOR *align = memalign(16,sizeof(int)*4);

ここでのポイントは、以下の通り。

  • COLOR(orange){6byte分多くメモリを確保して、ずらすことでアライメントを調整}
  • COLOR(orange){freeするために、malloc関数から返された元々のアドレス確保しておく (ずらしたアドレスをfreeしてはいけない!) }
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy