変更の始め

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 変数を設定します。
      # LIBPATH=/usr/opt/zlibNX/lib:$LIBPATH <application>
      LD_LIBRARY_PATH 変数の設定における欠点は、ローダーがまず最初に、指定されたディレクトリーで必要なライブラリーを見つけようと試みる、という点です。
    アプリケーションが、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 関数

下のリストで、NX GZIP アクセラレーターによって使用される 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
deflateSetDictionary(z_streamp strm, const Bytef *dictionary, uInt dictLength)
バイト・シーケンスに指定されている値 (dictionary パラメーター) でコンプレッション・ディクショナリーを初期化します。 コンプレッション・ディクショナリーは、後で圧縮対象のデータに見つかる可能性があるストリングから構成されている必要があります。
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)
dictionary パラメーターに設定されている圧縮解除ディクショナリーを返します。
inflateSync
inflateSync(z_streamp strm)
考えられるフル・フラッシュ・ポイント に達するまで、inflate 操作の間に圧縮データをスキップします。 フル・フラッシュ・ポイント に達していない場合、inflate 操作は有効な入力データをすべてスキップします。 フル・フラッシュ・ポイント とは、flush パラメーターが 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
inflatePrime(z_streamp strm, int bits, int value)
ビットを inflate 入力ストリームに挿入します。 この関数は、バイト内のビット位置で inflate 操作を開始するために使用されます。 圧縮操作はソフトウェア・ベース圧縮解除にフォールバックされます。
inflateMark
inflateMark(z_streamp strm)
入力ストリームからランダムにデータにアクセスするときの位置をマークします。これは、データ・ストリーム内のビット位置で指定されます。 2 つの 16 ビット値 (32 ビット入力データの上半分と下半分) を返します。
inflateGetHeader
inflateGetHeader(z_streamp strm, gz_headerp head)
GZIP ヘッダー情報を、指定されたヘッダー構造に返します。
inflateBackInit
inflateBackInit()
inflateBack 関数を呼び出すことによって、圧縮解除操作のために内部ストリームを初期化します。 圧縮解除操作はソフトウェア・ベース圧縮解除にフォールバックされます。 この関数は、ストリームの先頭でのみサポートされます。
inflateBack
inflateBack(z_streamp strm,in_func in,
void FAR *in_desc,out_func out,void FAR *out_desc)
コールバック・インターフェースを入出力データに対して使用することによって、ロー inflate 操作を実行します。 圧縮解除操作はソフトウェア・ベース圧縮解除にフォールバックされます。 この関数は、inflateBackInit 関数が呼び出された後でのみ呼び出す必要があります。
inflateBackEnd
inflateBackEnd(z_streamp strm)
inflateBackInit 関数によって割り振られたメモリーをすべて解放します。 圧縮解除操作はソフトウェア・ベース圧縮解除にフォールバックされます。
変更の終わり