zlibNX ライブラリーを使用したデータ圧縮
zlibNX ライブラリーは zlib 圧縮ライブラリーの拡張バージョンで、IBM® POWER9™
プロセッサー・ベース・サーバー上のネスト・アクセラレーター (NX) と呼ばれるコプロセッサーを使用して、ハードウェア加速データ圧縮/圧縮解除をサポートします。 zlibNX ライブラリーは、IBM AIX® 7.2 (テクノロジー・レベル 4 適用) Expansion Pack 以降に用意されています。 IBM AIX® 7.2 Technology Level 5 Service Pack 2 以降では、 zlibNX インストール・パッケージは、Expansion Pack に加えて AIX ベース・メディアでも入手できます。
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ライブラリーにリンクできます。- 以下の方法で示すように、 LDR_PRELOAD または LDR_PRELOAD64 変数を設定して、標準
zlibライブラリーをロードする前に、ハードウェア加速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ライブラリーへのパスを使用してアプリケーションを更新する必要があります。- 以下の方法で示すように、 LDR_PRELOAD または LDR_PRELOAD64 変数を設定して、標準
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値が渡されると、zlibNXAPI は標準zlibAPI にフォールバックされます。 - Z_FULL_FLUSH
- 圧縮操作の保留中の出力すべてを、出力メモリー・バッファーに送信します。出力はバイト境界で終わります。 圧縮状態をリセットします。
- Z_FINISH
- 保留中の入力データを deflate 関数に転送し、保留中の出力を deflate 関数からフラッシュします。 出力メモリーが十分であれば、
deflate関数はZ_STREAM_END値を返します。deflate関数がthe Z_OKまたはZ_BUF_ERROR値を返す場合、deflate 関数が Z_STREAM_END 値またはエラーで戻るまで、 flush パラメーターにZ_FINISH値を指定し、出力スペースを追加し、入力データを追加しないで、deflate 関数を再度呼び出す必要があります。
- deflateEnd(z_streamp strm)
- 圧縮操作の割り振り状態情報を解放します。
- deflateInit2
deflateInit2(z_streamp strm,int level, int method, int windowBits, int memLevel, int strategy)圧縮操作を初期化します。 この関数では、以下のパラメーターを指定できます。- レベル
- 以下の値のいずれかを level パラメーターに指定できます。
- Z_NO_COMPRESSION
- 圧縮はソフトウェア・ベース圧縮にフォールバックされます。
- Z_BEST_SPEED
- 現在、このレベルが
Z_DEFAULT_COMPRESSIONレベルであると見なされ、デフォルト・レベルです。 - Z_BEST_COMPRESSION
- レベル 1 から 9 がレベル 6 (つまり、
Z_DEFAULT_COMPRESSIONレベル) として扱われます。
- method
- 以下の値のいずれかを 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 です。 この値は現在無視されます。
zlibNXAPI は常に、大きな内部圧縮状態 (約 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関数は、zlibNXAPI によってサポートされています。- 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関数によって割り振られたメモリーをすべて解放します。 圧縮解除操作はソフトウェア・ベース圧縮解除にフォールバックされます。