【PL/I学習|実務向け】メインフレーム性能の要:FIXED BINARYの「境界合わせ」とALIGNED属性の最適化

1. 導入

メインフレームのバッチ処理において、膨大なレコードを処理する際、なぜか期待したスループットが出ない……そんな経験はありませんか。その原因の一つに、COBOLやPL/Iで定義した「FIXED BINARY型」の物理配置が関係しています。特に「ALIGNED」属性の指定漏れは、CPUがデータをメモリから読み込む際に余分な命令(IC命令等)を発生させ、計算性能を著しく低下させます。本稿では、BIN属性の境界合わせの仕組みと、性能最適化のための実装テクニックを解説します。

2. 基礎知識

メインフレーム(z/Architecture)において、演算データはメモリ上の境界(Boundary)に正しく配置されていることが、高速処理の前提となります。BIN属性のビット数に応じ、以下の物理配置がなされます。

・BIN(1)〜(15):2バイト(ハーフワード境界)
・BIN(16)〜(31):4バイト(フルワード境界)
・BIN(32)〜(63):8バイト(ダブルワード境界)

「ALIGNED」を指定すると、コンパイラは変数の先頭をその境界に強制的に配置します。逆に指定がない場合(UNALIGNED)、変数は直前のフィールドの直後に配置されるため、境界からズレてしまい、CPUはデータをロードするために複数のメモリアクセスや補正処理を行う必要が出てくるのです。

3. 実装/解決策

性能を最大化するためには、計算に使用するフラグやカウンタには必ず「ALIGNED」を指定します。特に、構造体(Structure)の中に定義する場合、デフォルトでUNALIGNEDになる言語仕様が多い点に注意が必要です。構造体の各メンバに明示的にALIGNEDを付与することで、メモリアクセスの最適化を図ります。

4. サンプルプログラム

以下は、PL/Iにおける性能を意識した定義の例です。

/ 性能を考慮したデータ定義のサンプル /
DCL 1 WORK_AREA,
/ カウンタ系は計算効率を考慮しALIGNEDを指定する /
5 PROC_COUNT FIXED BIN(31) ALIGNED,
/ フラグ系も同様に境界合わせを行うことでアクセス速度を向上 /
5 STATUS_FLAG FIXED BIN(15) ALIGNED,
/ 構造体の整合性を保つためのダミー領域(必要に応じて調整) /
5 FILLER CHAR(2);

/ 処理ロジックの例 /
PROC_COUNT = PROC_COUNT + 1;

/ ALIGNEDを指定することで、CPUはフルワード命令を直接実行し、/
/ メモリ上の配置ズレによるペナルティ(IC命令等の発生)を回避します。/

5. 応用・注意点

現場での移行プロジェクトや新規開発において、以下の点に注意してください。

構造体の再設計:UNALIGNEDからALIGNEDに変更すると、構造体全体のサイズが変化します。既存のファイル入出力(I/O)定義や、外部サブシステムとのインターフェースで構造体を共有している場合、レイアウトが変わることでデータ不整合を起こす可能性があります。外部I/O定義には不用意に変更を加えず、内部処理用のワーク領域に対して積極的に適用してください。

性能シミュレーション:大量のループ処理(数千万件単位)を行うプログラムでは、この属性一つでCPU時間が数%から十数%改善することがあります。性能要件が厳しいバッチプログラムでは、必ずコンパイルリストの「Storage Map」を確認し、各変数が意図した境界に配置されているかチェックする習慣をつけましょう。

コメント

タイトルとURLをコピーしました