科学計算におけるデータ構造のビットパッキングと圧縮


8

私は最近、この論文に出くわしました。この論文では、疎行列を表す際にメモリを節約する方法について説明しています。32ビット整数は、最大40億までの数値を格納できます。しかし、PDEを解くと、未知数の数が40億に近づくずっと前に、問題が並列化されて分割されました。彼らのアイデアは、帯域幅が狭い場合にマトリックスを並べ替えることです。j特定の行にすべてのゼロ以外の列のインデックスを格納するのではなく、並べ替えによって大きさが小さくなる傾向があるiオフセットを格納j - iします。オフセットは、32ビット整数よりも少ないビット数で保存できます。行列のゼロ以外のエントリを反復処理する場合は、より多くの計算を行う必要がありますが、キャッシュミスを少なくすることによる節約は、それを補う以上のミスをもたらします。では、この論文彼らは特に階層マトリックス形式で16ビットインデックスを使用することを検討していましたが、最終的には同様のアイデアです。ライブラリzfpもあります。これは、浮動小数点データを圧縮するためのものです。

現在「フロップは無料」であり、ボトルネックはメモリアクセスであるため、この種のトリックはCPUキャッシュをより有効に活用するために非常に有望であるように見えます。

私はこれら2つの論文の引用/引用のほとんどを精査しました。私は、ビットパッキングの有効性、スパース行列ベクトルの乗算、および計算科学の他の問題について、他の参考資料を探しています。たとえば、このアイデアを使用して、グラフや非構造化メッシュのデータ構造をはるかに効率的に設計できると思います。

回答:


7

スパース行列のメモリの削減

n×nn23×3

形式の詳細な説明はここにあります:http : //www.netlib.org/utk/people/JackDongarra/etemplates/node375.html

さらに、スパースマトリックスに密なブロックを格納すると、SSEまたはAVX命令を使用してマトリックス-ベクトルの乗算をベクトル化できますが、おそらくここで大きなスピードアップは見られません。 。

n

https://bebop.cs.berkeley.edu/pubs/vuduc2005-ubcsr-split.pdf

もちろん、メモリ要件をさらに削減するためにBCSRマトリックスを並べ替えてビットパッキングゲームをプレイすることを妨げるものは何もありませんが、おそらく、最初に、ぶら下がっている果物を選択する必要があります。

一般的なビットパッキング

ビットパッキングのアプリケーションに特に関心がある場合は、LLVMプロジェクトで積極的に行われます。その(賢い?)アイデアの1つは、ポインターと小さな整数を1つのポインターのスペースに一緒に格納するPointerIntPairと呼ばれるものを使用することです。ここでの考え方は、(Linux x64システムでは)mallocによって返されるポインターが16バイトに整列されているという事実を利用することです。彼らは、このアイデアを使用してあらゆる種類のクレイジーなことを行い、単一のポインターの空間に存在する複雑なデータ構造を構築します。LLVMオプティマイザの1人が数年前に行った興味深い会議講演を以下に示します。彼は22:00にこれについて話し始めます。ただし、公平な警告:これはC ++の会議で行われたため、簡潔で複雑なC ++が大量に含まれています。

https://www.youtube.com/watch?v=vElZc6zSIXM&t=22m&ab_channel=CppCon

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.