zlibNX ライブラリーを使用したデータ圧縮
zlibNX
ライブラリーは zlib
圧縮ライブラリーの拡張バージョンで、IBM® POWER9™
プロセッサー・ベース・サーバー上のネスト・アクセラレーター (NX) と呼ばれるコプロセッサーを使用して、ハードウェア加速データ圧縮/圧縮解除をサポートします。
zlibNX
ライブラリーは、IBM AIX® 7.2 (テクノロジー・レベル 4 適用) Expansion Pack 以降に用意されています。
zlibNX
ライブラリーは、以下の Request For Comments (RFC) 標準に準拠しています。
- RFC 1950 (zlib 圧縮データ・フォーマット仕様)
- RFC 1951 (DEFLATE 圧縮データ・フォーマット仕様)
- RFC 1952 (gzip ファイル・フォーマット仕様)
RFC 標準によって、さまざまな zlib
ライブラリー実装における互換性が保証されます。zlibNX
ライブラリーを使用して圧縮されたデータは、標準 zlib
ライブラリーを使用して圧縮解除できます。
同様に、標準 zlib
ライブラリーを使用して圧縮されたデータは、zlibNX
ライブラリーを使用して圧縮解除できます。
アプリケーションが zlibNX インターフェースを使用できるようにする
libz.so.1
ライブラリーまたは libz.a
ライブラリーにリンクしているかに基づいて、zlibNX
インターフェースを使用できます。
libz.a
ライブラリーにもlibz.so.1
ライブラリーにもリンクしていないアプリケーションは、再コンパイルするか、あるいは /usr/opt/zlibNX/include/ パスに指定されているzlibNX
アーカイブ・ファイルおよびzlibNX
ヘッダー・ファイルに再リンクさせる必要があります。libz.a
ライブラリーへのスタティック・リンクを行っているアプリケーションは、/usr/opt/zlibNX/static/lib/libz.a
パスを使用してzlibNX
インターフェースにアクセスできます。-
libz.a
ライブラリーへのダイナミック・リンクを行っているアプリケーションは、/usr/opt/zlibNX/lib/libz.a パスを使用できます。 ダイナミック・リンクされたアプリケーションは、以下のいずれかの方法でハードウェア加速zlib
ライブラリーにリンクできます。- 標準
zlib
ライブラリーをロードする前に、以下の方法に示されているように、LDR_PRELOAD 変数または LDR_PRELOAD64 変数を、ハードウェア加速zlib
ライブラリーをロードするように設定します。# LDR_PRELOAD="/usr/opt/zlibNX/lib/libz.a(libz.so.1)" <32-bit application> # LDR_PRELOAD64="/usr/opt/zlibNX/lib/libz.a(libz.so.1)" <64-bit application>
- 次の例に示すように、LD_LIBRARY_PATH 変数を設定します。
# LD_LIBRARY_PATH=/usr/opt/zlibNX/lib:$LD_LIBRARY_PATH <application>
- 次の例に示すように、LIBPATH 変数を設定します。
LD_LIBRARY_PATH 変数の設定における欠点は、ローダーがまず最初に、指定されたディレクトリーで必要なライブラリーを見つけようと試みる、という点です。# LIBPATH=/usr/opt/zlibNX/lib:$LIBPATH <application>
dlopen
サブルーチンを使用して libz.so.1 ライブラリーを動的にロードする場合、そのアプリケーションをハードウェア加速zlib
ライブラリーのパスで更新する必要があります。 - 標準
zlibNX ライブラリーの最適化
既存の zlib
アプリケーションの多くは、最適な zlibNX
のパフォーマンスを実現するためにラージ入出力メモリー・バッファーを使用することはありません。
以下のガイドラインに従って、アプリケーションによって使用される入出力バッファーのサイズを大きくすることができます。
- ハードウェア加速データ圧縮解除においては、出力メモリー・バッファーを入力メモリー・バッファーの N 倍
(ここで N は、予期される圧縮率) に大きくすることができます。
N の値は、データのランダム性によって異なります。
最高の圧縮パフォーマンスを実現するためには、十分な圧縮入力データを
inflate
関数に指定する必要があります。 - ハードウェア加速データ圧縮においては、等しいサイズの入出力メモリー・バッファーを選択できます。
zlibNX ライブラリーの環境変数
zlibNX
ライブラリーでは、エラー情報とデバッグ情報を収集するために以下の環境変数が使用されます。
以下の環境変数のデフォルト値は、オーバーライドすることができます。
- ZLIB_VERBOSE
- ログ・ファイルに書き込まれる、さまざまなレベルの低レベル・デバッグ情報を有効にします。値 0 であれば、デバッグ情報はログ・ファイルに書き込まれません。 値 3 であれば、詳細デバッグ情報がログ・ファイルに書き込まれます。 デフォルト値は 0 です。
- ZLIB_LOGFILE
- デバッグ情報を指定のログ・ファイルに書き込みます。
ZLIB_LOGFILE 環境変数が設定されていない場合、デバッグ情報は
stderr
ストリームに出力されます。 - ZLIB_COMPRESS_ACCEL
zlibNX
ライブラリーのdeflate
関数を使用したハードウェア加速データ圧縮解除を有効または無効にします。 値 0 であれば、ハードウェア加速データ圧縮は無効になります。 値 1 であれば、ハードウェア加速データ圧縮が有効になります。 デフォルト値は 1 です。- ZLIB_DECOMPRESS_ACCEL
zlibNX
ライブラリーのinflate
関数を使用したハードウェア加速データ圧縮解除を有効または無効にします。 値 0 であれば、ハードウェア加速データ圧縮解除は無効になります。値 1 であれば、ハードウェア加速データ圧縮解除が有効になります。デフォルト値は 1 です。
サポートされる zlib 関数
zlib
関数について説明します。
いくつかの zlib
関数は、NX アクセラレーターを使用して実行することができません。
そのようなケースでは、圧縮または圧縮解除はソフトウェア・ベース操作にフォールバックされます。
- zlibVersion
zlibNX
ライブラリーのバージョンを返します。例:1.2.11.1-AIX_NX
.- deflateInit(z_streamp strm, int level)
- 圧縮操作を初期化します。
ユーザーによって level パラメーターに指定された値は無視され、代わりに
Z_DEFAULT_COMPRESSION
レベルの値が圧縮操作に使用されます。 - deflate(z_streamp strm, int flush)
-
データを圧縮します。 圧縮操作によって使用されている入力メモリー・バッファーが空になるか、または圧縮操作によって使用されている出力メモリー・バッファーがフルになると、データ圧縮は停止します。
NX アクセラレーターによるデータ圧縮の最小しきい値を満たすために、入力データがバッファーに入れられると、出力待ち時間が生じます。 入力メモリー・バッファーのサイズが十分ではない場合、従来のソフトウェア・ベース圧縮が行われます。
以下の値のいずれかを flush パラメーターに指定できます。
- Z_NO_FLUSH
- 圧縮出力が生成される前に圧縮操作によって使用されるデータの量 (入力メモリー・バッファーに累積される) を決定します。
- Z_SYNC_FLUSH
- 圧縮操作の保留中の出力すべてを、出力メモリー・バッファーに送信します。出力はバイト境界で終わります。 バイト境界は、メモリーにおけるバイトの終端です。
- Z_PARTIAL_FLUSH
-
有効な入力データを圧縮し、圧縮操作の保留出力を送信します。 出力データはバイト境界で終わるわけではありません。つまり、メモリーの空のブロックが出力データに付加されます。
Z_PARTIAL_FLUSH
関数とZ_SYNC_FLUSH
関数は、その機能性において類似しています。 - Z_BLOCK
- データ・ブロックの圧縮が完了したことを示します。
Z_BLOCK
値が渡されると、zlibNX
API は標準zlib
API にフォールバックされます。 - Z_FULL_FLUSH
- 圧縮操作の保留中の出力すべてを、出力メモリー・バッファーに送信します。出力はバイト境界で終わります。 圧縮状態をリセットします。
- Z_FINISH
- 保留中の入力データを deflate 関数に転送し、保留中の出力を deflate 関数からフラッシュします。
出力メモリーが十分であれば、
deflate
関数はZ_STREAM_END
値を返します。deflate
関数がZ_OK
値またはZ_BUF_ERROR
値を返す場合、Z_STREAM_END 値またはエラーを返すまで、その deflate 関数をもう一度、flush パラメーターとしてZ_FINISH
値を指定し、出力スペースを大きくして入力データは増やさずに呼び出す必要があります。
- deflateEnd(z_streamp strm)
- 圧縮操作の割り振り状態情報を解放します。
- deflateInit2
-
deflateInit2(z_streamp strm,int level, int method, int windowBits, int memLevel, int strategy)
圧縮操作を初期化します。 この関数では、以下のパラメーターを指定できます。- level
- 以下の値のいずれかを level パラメーターに指定できます。
- Z_NO_COMPRESSION
- 圧縮はソフトウェア・ベース圧縮にフォールバックされます。
- Z_BEST_SPEED
- 現在、このレベルが
Z_DEFAULT_COMPRESSION
レベルであると見なされ、デフォルト・レベルです。 - Z_BEST_COMPRESSION
- レベル 1 から 9 がレベル 6 (つまり、
Z_DEFAULT_COMPRESSION
レベル) として扱われます。
- メソッド
- 以下の値のいずれかを method パラメーターに指定できます。
- Z_DEFLATED
- method パラメーターが
Z_DEFLATED
以外の値になっていると、圧縮はソフトウェア・ベース圧縮解除にフォールバックされます。
- windowBits
- 内部ヒストリー・バッファーのサイズをサイズを示します。
ベース 2 対数の値を受け入れます。ヒストリー・バッファーのサイズ (ウィンドウ・サイズ) は、範囲 256 バイトから 32 KB にすることができます。
windowBits パラメーターは、内部入力メモリー・バッファー用に割り振られているメモリーに影響します。以下の範囲の値を windowBits パラメーターに指定できます。
- 8 から 15
zlib
フォーマットを示します。- -8 から -15
- ロー deflate フォーマットを示します。 ロー deflate フォーマットは、圧縮データ・フォーマットを意味します。
- 24 から 31
- GZIP フォーマットを示します。
deflateInit2
関数は要求されたフォーマットを受け入れますが、常に 32 KB ウィンドウまたはヒストリー・バッファーを使用します。 - MemLevel
- 内部圧縮状態として割り振られるメモリーの量を示します。内部圧縮状態は、圧縮関連情報をトラッキングするためにソフトウェア・ライブラリーで使用されるデータ構造です。
この値は、範囲 1 から 9 にすることができます。デフォルト値は 8 です。現在、この値は無視されます。
zlibNX
API は常に、大きな内部圧縮状態 (約 1 MB) を割り振ります。 - strategy
-
圧縮操作に使用する必要があるアルゴリズムを示します。 以下の値のいずれかを strategy パラメーターに指定できます。
- Z_DEFAULT_STRATEGY
- ストリング・マッチング・アルゴリズムを含む動的 Huffman アルゴリズムが使用されます。
- Z_FIXED
- 動的 Huffman アルゴリズムは使用されません。
- Z_HUFFMANONLY
- ストリング・マッチングのない Huffman アルゴリズムのみ使用されます。 圧縮操作はソフトウェア・ベース圧縮にフォールバックされます。
- Z_FILTERED
- フィルターまたは予測子によって作成されたデータが、deflate 関数への入力です。 圧縮操作はソフトウェア・ベース圧縮にフォールバックされます。
- Z_RLE
- 制限付きストリング・マッチング・ディスタンスを持つハフマン・エンコード方式アルゴリズムが使用されます。圧縮操作はソフトウェア・ベース圧縮にフォールバックされます。
- inflateInit(z_streamp strm)
- 圧縮解除操作を初期化します。
- inflate(z_streamp, int flush)
- 入力メモリー・バッファーが空になるまで、または出力メモリー・バッファーがフルになるまで、データを圧縮解除します。
ハードウェア・ベース・アクセラレーションは、圧縮操作に使用される入力メモリー・バッファーが十分に大きいことが必要です。
そうでない場合は、ソフトウェア・ベース圧縮操作が使用されます。
入力メモリー・バッファーのデフォルトしきい値は 4 KB です。
flush パラメーターには、以下の値のいずれかを指定できます。
- Z_NO_FLUSH
- 入力の終わりに達するか、または出力メモリー・バッファーの終わりに達するまで、データを圧縮解除します。
- Z_SYNC_FLUSH
- 出力メモリー・バッファーの最大容量に達するまで、圧縮解除操作の出力を出力メモリー・バッファーに送信します。
- Z_FINISH
- 圧縮解除操作の 1 回の反復で、すべてのデータを圧縮解除しようと試みます。
- Z_BLOCK
- 次の deflate ブロック境界に達すると、圧縮解除操作を停止します。 ブロック境界とは、deflate ブロックが終わる位置を指します。
- InflateEnd
InflateEnd
関数は、zlibNX
API によってサポートされています。- deflateSetDictionary
バイト・シーケンスに指定されている値 (dictionary パラメーター) でコンプレッション・ディクショナリーを初期化します。 コンプレッション・ディクショナリーは、後で圧縮対象のデータに見つかる可能性があるストリングから構成されている必要があります。deflateSetDictionary(z_streamp strm, const Bytef *dictionary, uInt dictLength)
- deflateGetDictionary
deflateGetDictionary(z_streamp strm, const Bytef *dictionary, uInt dictLength)
deflate
関数によって保守されているスライディング・ディクショナリー (ヒストリー・バッファー) を返します。 スライディング・ディクショナリーとは、圧縮解除データが入っているメモリー・バッファーです。- deflateCopy
ストリームをコピーして、内部圧縮状態を複製します。 宛先ストリームは、アクセラレーターにアクセスできない可能性があります。deflateCopy(z_streamp dest, z_streamp source)
- deflateReset
内部圧縮状態を解除して再割り振りすることなく、ストリームの状態をリセットします。deflateReset(z_streamp strm)
- deflateParams
入力パラメーターに基づいて、deflateParams(z_streamp strm, int level, int strategy)
zlibNX
ライブラリーの deflate 関数をサポートします。 圧縮レベルは変更されません。- deflateTune
deflateTune(z_streamp strm, int good_length, int max_lazy,int nice_length, int max_chain)
deflate
関数の内部圧縮パラメーターを詳細化します。 圧縮操作はソフトウェア・ベース圧縮にフォールバックされます。- deflateBound(z_streamp strm, uLong sourceLen)
deflate
関数に渡される sourceLen バイトに対してdeflateBound
操作が実行された後の、圧縮データの最大サイズを返します。- deflatePending
-
deflatePending(z_streamp strm, unsigned *pending, int *bits)
生成されていても圧縮操作の出力にまだ表示されていない出力を返します。
- deflatePrime
圧縮操作はソフトウェア・ベース圧縮にフォールバックされます。deflatePrime(z_streamp strm, int bits, int value)
- deflateSetHeader(z_streamp strm, gz_headerp head)
- 指定された GZIP ストリームの GZIP ヘッダー情報を提供します。
- inflateInit2
inflateInit2(z_streamp strm, int windowBits)
inflateinit
関数と似ていますが、追加のパラメーター windowBits を受け入れます。- windowBits
- ベース 2 対数の値を受け入れます。
ヒストリー・バッファーのサイズ (ウィンドウ・サイズ) は、範囲 256 バイトから 32 KB にすることができます。
deflateInit2
関数は要求されたフォーマットを受け入れますが、常に 32 KB ウィンドウまたはヒストリー・バッファーを使用します。 以下の範囲の値を windowBits パラメーターに指定できます。- 8 から 15
zlib
フォーマットを示します。- 24 から 31
- GZIP フォーマットを示します。
- 40 から 47
- 自動ヘッダー検出を示します。
- -8 から -15
- ロー deflate フォーマットを示します。
inflateInit2
関数は要求されたフォーマットを受け入れますが、常に 32KB ウィンドウまたはヒストリー・バッファーを使用します。- inflateSetDictionary
指定された圧縮解除バイト・シーケンスにある圧縮解除ディクショナリーを初期化します。inflateSetDictionary(z_streamp strm, const Bytef *dictionary, uInt dictLength)
- inflateGetDictionary
-
inflateGetDictionary(z_streamp strm, Bytef *dictionary, uInt *dictLength)
- inflateSync
考えられるフル・フラッシュ・ポイント に達するまで、inflate 操作の間に圧縮データをスキップします。 フル・フラッシュ・ポイント に達していない場合、inflate 操作は有効な入力データをすべてスキップします。 フル・フラッシュ・ポイント とは、flush パラメーターがinflateSync(z_streamp strm)
Z_FULL_FLUSH
値に設定された状態でdeflate()
関数が呼び出されたときに生成された、圧縮データ内の位置を指します。- inflateCopy
宛先ストリームを、ソース・ストリームのコピーとして設定します。inflateCopy(z_streamp dest, z_streamp source)
- inflateReset
圧縮状態をリセットしますが、その圧縮を解除するわけではありません。inflateReset(z_streamp strm)
- inflateReset2
inflateReset2(z_streamp strm, int windowBits)
inflateReset2
関数はinflateReset
関数に似ていますが、wrap
値とウィンドウ・サイズ値の変更も許可します。windowBits
パラメーターは、inflateInit2
機能で使用される場合と同じように使用されます。 ヒストリー・バッファーのサイズ (ウィンドウ・サイズ) は静的に 32 KB ですが、windowBits
パラメーターによって指示されたフォーマットは圧縮解除に使用されます。- inflatePrime
ビットを inflate 入力ストリームに挿入します。 この関数は、バイト内のビット位置で inflate 操作を開始するために使用されます。 圧縮操作はソフトウェア・ベース圧縮解除にフォールバックされます。inflatePrime(z_streamp strm, int bits, int value)
- inflateMark
入力ストリームからランダムにデータにアクセスするときの位置をマークします。これは、データ・ストリーム内のビット位置で指定されます。 2 つの 16 ビット値 (32 ビット入力データの上半分と下半分) を返します。inflateMark(z_streamp strm)
- inflateGetHeader
GZIP ヘッダー情報を、指定されたヘッダー構造に返します。inflateGetHeader(z_streamp strm, gz_headerp head)
- inflateBackInit
inflateBackInit()
inflateBack
関数を呼び出すことによって、圧縮解除操作のために内部ストリームを初期化します。 圧縮解除操作はソフトウェア・ベース圧縮解除にフォールバックされます。 この関数は、ストリームの先頭でのみサポートされます。- inflateBack
コールバック・インターフェースを入出力データに対して使用することによって、ロー inflate 操作を実行します。 圧縮解除操作はソフトウェア・ベース圧縮解除にフォールバックされます。 この関数は、inflateBack(z_streamp strm,in_func in, void FAR *in_desc,out_func out,void FAR *out_desc)
inflateBackInit
関数が呼び出された後でのみ呼び出す必要があります。- inflateBackEnd
inflateBackEnd(z_streamp strm)
inflateBackInit
関数によって割り振られたメモリーをすべて解放します。 圧縮解除操作はソフトウェア・ベース圧縮解除にフォールバックされます。