アライメント(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);
	

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

  • 6byte分多くメモリを確保して、ずらすことでアライメントを調整
  • freeするために、malloc関数から返された元々のアドレス確保しておく (ずらしたアドレスをfreeしてはいけない!)

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-03-10 (土) 18:37:41 (2827d)