LYNPACK

LYNPACK

LYNPACKは線形代数学の数値演算を行なうライブラリ関数で、1970年代〜1980年頃にスパコンで実行するFortranプログラムとして開発された。


LYNPACKベンチマークは線型方程式をガウスの消去法で解くプログラムで、システムの浮動小数点演算能力が測られる。スパコンベンチマークランキングTOP500に使われているが、LYNPACKは密係数行列(係数行列に0があまり無い)のためキャッシュヒット率が高いが、一般の大規模問題ではキャッシュにあまりヒットせずメモリバンド幅に影響されるため、スパコンベンチマークとして良くないとの声もある。

実用

線形方程式(一次方程式)は、ax+by+cz+...=d の形の方程式で、例えば鶴亀算も線形方程式系であらわされる。
線形方程式の用途の一つとしてJPEGのDFT処理がある。

JPEG

JPEGの圧縮処理は以下にようにおこなわれる。

(1)画像を8x8ピクセルのブロックの領域に分け、それぞれに対して計算を行なう(このためJPEG圧縮率を上げて品質を下げると、8x8ピクセルサイズのノイズが発生する)


(2)それぞれの領域について、色空間に分ける。色空間の分け方には、RGB、YCbCr,YMCKなどがあるが、JPEGではYCbCrが使われる。(色空間を分けると、各空間は濃度だけの情報となる)


(3)8x8の濃度情報を二次元DFT変換して周波数成分に変換する。(計算式はWikipedia参照)

x軸方向の周波数成分uの値域は 0,1,2,3,4,5,6,7
y軸方向の周波数成分vの値域は 0,1,2,3,4,5,6,7
で、DCT係数 G(u,v)を計算する。(それぞれx=0〜7,y=0〜7の繰り返しを行なうため、Gを計算するには、8x8x8x8回のforループが必要・・・なのか?)

周波数軸に変換しても情報劣化は無い。(実際のところ、浮動小数点誤差で劣化すると思われるが、意味的には無いということだと思う。多分)

Gの最左上をDC係数、それ以外をAC係数という。人間の目は広範囲の大きさの変化には敏感だが、高周波数成分の違いには鈍感である。例えば、「色が変わった」「色が変わらなかった」というような大枠の情報については敏感だが、「濃度0から100に変わった場合と99に変わった場合の差」のような高周波数成分には鈍感である。よって、JPEGでは低周波数成分を重要視してデータ圧縮を行なう。


(4)量子化マトリクスを使って、DCT係数Gを量子化する。
量子化のおいて整数への丸め込みを行なう。ここで誤差を生じる。標準の量子化マトリクスは高周波数ほど小さい数値となるようになっており、高周波数ほど丸め込み量が増える(多分)


(5) 量子化結果を符号化する。二次元の表に対し、左上(低周波数側)からジグザグに符号化し、途中で残りが全て0ならEOBという記号を入れて打ち切る。符号化はハフマン符号を用いる。プログレシブJPEGとシーケンシャルJPEGでこのあたり違っている。

ハフマン符号・シャノン符号

ともに出現頻度の高い記号に少ないビット数のコードを割り振ることで、全体のビット数を減らす符号化である。
ともに事前に記号の出現頻度は既知であることが前提。


A 2回 B 4回 C 7回 D8回…

に対して


D 1
C 01
B 001
A 0001
:

のように符号化することも


D 0
C 100
B 101
A 1100
:

のように符号化することも可能。
(ツリーにした場合の木の形が異なる)

出現数が差があまり無いなら同じぐらいのビット数に
符号化するほうが望ましい

シャノン符号はトップダウン式に、含まれる記号数が同じぐらいになるように分けながら符号化する。
ハフマン符号はボトムアップ式に、木の下側から符号化していく。

ハフマン符号は最短であることが保障されるが、
シャノンはそうではない。

ともに圧縮データに符号化木の情報を付ける必要がある。