IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 日立ヴァンタラ株式会社の特許一覧

<>
  • 特許-受信したデータを処理する装置 図1
  • 特許-受信したデータを処理する装置 図2A
  • 特許-受信したデータを処理する装置 図2B
  • 特許-受信したデータを処理する装置 図3A
  • 特許-受信したデータを処理する装置 図3B
  • 特許-受信したデータを処理する装置 図4A
  • 特許-受信したデータを処理する装置 図4B
  • 特許-受信したデータを処理する装置 図5A
  • 特許-受信したデータを処理する装置 図5B
  • 特許-受信したデータを処理する装置 図6
  • 特許-受信したデータを処理する装置 図7
  • 特許-受信したデータを処理する装置 図8
  • 特許-受信したデータを処理する装置 図9
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-11-07
(45)【発行日】2024-11-15
(54)【発明の名称】受信したデータを処理する装置
(51)【国際特許分類】
   H03M 7/40 20060101AFI20241108BHJP
   G06F 3/06 20060101ALI20241108BHJP
   H03M 7/30 20060101ALI20241108BHJP
【FI】
H03M7/40
G06F3/06 301W
H03M7/30 Z
【請求項の数】 7
(21)【出願番号】P 2023105981
(22)【出願日】2023-06-28
(62)【分割の表示】P 2020208090の分割
【原出願日】2020-12-16
(65)【公開番号】P2023130405
(43)【公開日】2023-09-20
【審査請求日】2023-06-28
(73)【特許権者】
【識別番号】524132520
【氏名又は名称】日立ヴァンタラ株式会社
(74)【代理人】
【識別番号】110001678
【氏名又は名称】藤央弁理士法人
(72)【発明者】
【氏名】水島 永雅
(72)【発明者】
【氏名】島田 健太郎
【審査官】原田 聖子
(56)【参考文献】
【文献】特開2001-189661(JP,A)
【文献】特開平08-195680(JP,A)
【文献】特開2013-126160(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
H03M 7/40
G06F 3/06
H03M 7/30
(57)【特許請求の範囲】
【請求項1】
受信したデータを処理する装置であって、
レンジ符号に基づき圧縮された入力コードの一部又は全部を伸張して、ビット列を復号する伸張回路を含み、
前記ビット列のビットのビット値は、前記ビット列において前記ビットより前のビットのビット履歴に基づき復号されるものであり、
前記伸張回路は、複数のデコーダを含み、
前記複数のデコーダそれぞれは、
前記ビット列において前記ビットより前のビットの取りうる予め用意された複数通りの候補ビット履歴に対応付けられる確率値に基づいて、前記ビット列のビットの候補ビット値を算出し、
前記伸張回路は、
正解ビット値を、前記複数のデコーダそれぞれが算出した複数の候補ビット値から、前記ビットより前のビットのビット履歴に基づき選択することを繰り返して、前記ビット列を復号する、装置。
【請求項2】
請求項1に記載の装置であって、
前記伸張回路は、
前記ビット履歴に応じて現れるビット値の前記確率値を格納し、
格納されている前記確率値において、前記ビット列の復号に使用された確率値を選択して更新する、装置。
【請求項3】
請求項1に記載の装置であって、
前記ビット列はNビット列であり、前記Nは1より大きい整数、Kは1からNの各整数を表し、
前記Nビット列における第Kビットの候補ビット値の算出は、2^(K-1)通りのビット履歴それぞれの確率値による分割対象レンジに対する乗算を実行して前記分割対象レンジを二つの区画に分割し、前記入力コードにおける前記第Kビットの前記二つの区画のうち前記入力コードから分離されたサブコードにより特定される区画から2^(K-1)通りそれぞれの候補ビット値を決定する、装置。
【請求項4】
請求項1に記載の装置であって、
前記伸張回路は、前記入力コード全体から復号するビット数が、予め設定された最大値よりも大きい場合、前記入力コードの一部からのビット列の復号を、複数サイクル実行する、装置。
【請求項5】
請求項4に記載の装置であって、
前記複数サイクルにおける第2サイクル以降のサイクルにおいて、前記複数の候補ビット値それぞれを決定するための分割対象レンジは、直前のサイクルにおける前記正解ビット値に対する区画である、装置。
【請求項6】
ストレージシステムであって、
ホストからの要求を受信するインタフェースと、
前記ホストからのコマンドに応じて記憶ドライブへのデータの書き込み及び前記記憶ドライブからのデータの読み出しを実行するコントローラと、を含み、
前記コントローラは、請求項1に記載の伸張回路を含み、
前記コントローラは、前記ホストからのリードコマンドに応じて前記記憶ドライブから転送された前記入力コードを前記伸張回路によって復号してリードデータを生成し、
前記リードデータを、前記インタフェースを介して前記ホストに返す、ストレージシステム。
【請求項7】
装置が、受信したデータを処理する方法であって、
前記装置は、レンジ符号に基づき圧縮された入力コードの一部又は全部を伸張して、ビット列を復号する伸張回路、を含み、
前記伸張回路は、複数のデコーダを含み、
前記ビット列のビットのビット値は、前記ビット列において前記ビットより前のビットのビット履歴に基づき復号されるものであり、
前記方法は、前記伸張回路が、
前記複数のデコーダそれぞれによって、前記ビット列において前記ビットより前のビットの取りうる予め用意された複数通りの候補ビット履歴に対応付けられる確率値に基づいて、前記ビット列のビットの候補ビット値を算出し、
正解ビット値を、前記複数のデコーダそれぞれが算出した複数の候補ビット値から、前記ビットより前のビットのビット履歴に基づき選択することを繰り返して、前記ビット列を復号する、方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、レンジ符号に基づき圧縮された入力コードを復号する技術に関する。
【背景技術】
【0002】
大量のデータを蓄積・管理するための情報機器であるストレージシステムは、より多くのデータを格納すれば容量当たりのコストを低減することができる。そのため、ストレージシステムには、書き込まれたデータを圧縮してからディスクドライブに格納する機能を搭載するものがある。
【0003】
例えば、近年、ストレージシステムの記憶媒体として、HDD(Hard Disk Drive)に加えて又は代えて、不揮発性半導体メモリであるNAND型フラッシュメモリを搭載したSSD(Solid State Drive)が採用されるようになってきた。SSDはデータアクセスにおいてHDDのような物理的なヘッドシーク機構を持たないため、頭出し遅延(レイテンシ)が少なく、ランダムなデータリードにおいて優れた応答性能を有する。
【0004】
そのため、高速なランダムリードが求められるデータベース等のアプリケーションでは、ストレージシステムの記憶媒体としてHDDからSSDへの置き換えが進んでいる。ただし、SSDのビットコストは、フラッシュメモリセルの高集積化に伴って年々安くなってきてはいるが、依然HDDのビットコストに比べて3倍程度と高いままである。
【0005】
そこで、SSDを記憶媒体とするストレージシステムは、可逆圧縮技術を導入し、SSDへ格納されるデータサイズを減らす機能を持つものが多い。それによって、システムの記憶容量を仮想的に大きく見せることができ、容量当たりのコストを低下させて、HDDを記憶媒体とするストレージシステムのそれに近づけることができる。
【0006】
ストレージシステムにホストから圧縮データに対する読み出し要求がきた場合、圧縮データを伸張し、元の平文データに戻してからホストに返す。その際のリード応答時間が、非圧縮データに対する読み出しの場合と比べて著しく悪化しないように、圧縮データの伸張処理はできるだけ高速に行うことが好ましい。
【0007】
ストレージシステムのデータ圧縮機能に採用する圧縮アルゴリズムは、高い圧縮率を持つものほど、容量当たりのコストを低減することができる。LZMAアルゴリズムは、高い圧縮率を持つことで知られる可逆データ圧縮アルゴリズムである。このアルゴリズムは、スライド辞書型圧縮にレンジ符号と呼ばれる算術符号を組み合わせたものである。
【0008】
レンジ符号処理では、1ビットを入力(符号化時)又は出力(復号時)するたびに乗算を行う必要がある。よって、レンジ符号処理のビットレートは非常に遅い。レンジ符号処理での乗算に用いる値のためにテーブルを参照するが、参照するためのインデックスは、入力(符号化時)又は出力(復号時)のビット履歴によって決まる。レンジ符号処理での乗算を複数ビット並列で行うことができれば、その性能は向上し、LZMAアルゴリズムの処理性能は向上する。
【0009】
レンジ符号の符号化処理(圧縮時)については、非特許文献1のように、ビット履歴をあらかじめ準備しておき、テーブル参照を並列化し、複数ビットについて乗算を並列に行って高速化する公知技術がある。並列度をNとすると、符号化性能はN倍に向上する。これによって、LZMAの圧縮処理は高速化が可能である。
【先行技術文献】
【非特許文献】
【0010】
【文献】“A Parallel Adaptive Range Coding Compressor: Algorithm, FPGA Prototype, Evaluation”, Ivan Shcherbakov and Norbert Wehn, Data Compression Conference, 2012.
【発明の概要】
【発明が解決しようとする課題】
【0011】
レンジ符号の復号(伸張時)については、直前のビットが復号されるまでビット履歴が不確定であるため、テーブル参照及びその参照値を用いた乗算を複数ビットについて並列で行うことは困難である。
【0012】
そのため、例えば、ストレージシステムの圧縮伸張機能にレンジ符号を適用した場合、伸張性能が低いことから、ホストからの読み出し要求に対するリード応答時間が大きくなって、ストレージシステムの利便性が悪化し得る。
【課題を解決するための手段】
【0013】
本発明の一態様は、受信したデータを処理する装置であって、レンジ符号に基づき圧縮された入力コードを受信する回路と、前記入力コードの一部又は全部を伸張して、ビット列を復号する複数の伸張回路と、を含み、前記入力コードのビットのビット値は、前記ビットより前のビットのビット履歴に基づき復号されるものであり、前記複数の伸張回路は、前記ビット列のビットの候補ビット値について、前記ビットより前のビットの取りうる複数通りのビット履歴に基づき複数の候補ビット値をそれぞれ算出し、正解ビット値を、前記複数の候補ビット値から、前記ビットより前のビットの正解ビット履歴に基づき選択することを繰り返して、前記ビット列を復号する。
【発明の効果】
【0014】
本発明の一態様によれば、レンジ符号の復号を高速化できる。
【図面の簡単な説明】
【0015】
図1】ストレージシステムの構成例を示す。
図2A】LZMAアルゴリズムの概要を示す。
図2B】辞書圧縮処理の具体例を示す。
図3A】レンジ符号化の機能ブロック図を示す。
図3B】レンジ復号の機能ブロック図を示す。
図4A】レンジ符号の原理を説明するための例を示す。
図4B】レンジ符号の原理を説明するための他の例を示す。
図5A】レンジ符号化処理のフローチャートを示す。
図5B】レンジ復号処理のフローチャートを示す。
図6】レンジ符号化処理の高速化方式の機能ブロック図を示す。
図7】レンジ符号化処理の高速化方式のフローチャートを示す。
図8】レンジ復号処理の高速化方式の機能ブロック図を示す。
図9】レンジ復号処理の高速化方式のフローチャートを示す。
【発明を実施するための形態】
【0016】
以下においては、便宜上その必要があるときは、複数のセクションまたは実施例に分割して説明するが、特に明示した場合を除き、それらは互いに無関係なものではなく、一方は他方の一部または全部の変形例、詳細、補足説明等の関係にある。また、以下において、要素の数等(個数、数値、量、範囲等を含む)に言及する場合、特に明示した場合及び原理的に明らかに特定の数に限定される場合等を除き、その特定の数に限定されるものではなく、特定の数以上でも以下でもよい。
【0017】
(1)システム構成
以下において、本明細書の一実施形態として、データ圧縮機能を持つストレージシステムを説明する。ストレージシステムは、格納データ量を可逆圧縮で削減する。本明細書で説明されるレンジ符号の復号は、ストレージシステムと異なるシステム、例えば、通信システムに適用することができる。
【0018】
図1は、本明細書の一実施形態に係るストレージシステムの構成例を示す。ストレージシステム101は、ホストI/F(Interface)102、ストレージコントローラ103、複数のSSD(Solid State Drive)105、DRAM(Dynamic Random Access Memory)などの揮発性メモリを利用するキャッシュメモリ106を含む。
【0019】
ストレージコントローラ103は、ホストI/F102、SSD105、キャッシュメモリ106と接続され、それらを制御するマイクロプロセッサを含む。マイクロプロセッサは、ホスト(図示せず)からのリード/ライトコマンドの内容解釈、ホストとの間のデータ送受信、LZMA圧縮伸張回路104によるデータの圧縮・伸張、SSD105やキャッシュメモリ106との間のデータ転送を実行する。
【0020】
ホストI/F102は外部のホストと接続するためのインタフェース機構であり、データをホストに送信したり、データをホストから受信したりするために、リード/ライトコマンドに応答する。ホストI/F102の機構及びコマンドやデータの送受信のプロトコルは、例えば、標準的なインタフェース規格に準拠する。
【0021】
ストレージコントローラ103はLZMA圧縮伸張回路104及び転送回路108を含む。転送回路108は、LZMA圧縮伸張回路104が圧縮又は伸張するデータを受信し、送信する。転送回路108は、ストレージシステム101の構成要素間、例えばLZMA圧縮伸張回路104とキャッシュメモリ106との間のデータを転送する。LZMA圧縮伸張回路104は、記憶ドライブであるSSD105に格納するデータ量を削減するため、ライトコマンドに応じて受信したライトデータを可逆的に圧縮し、圧縮データを生成する。また、リードコマンドに応じて元の平文データをホストに送信するため、SSD105から読み出した圧縮データを伸張して平文データを生成する。
【0022】
ホストからのライトデータは、まずキャッシュメモリ106に一時的に格納される。この時点でストレージコントローラ103はホストに対してライト完了を返す。その後、LZMA圧縮伸張回路104を通じて圧縮データへと変換され、圧縮データもまたキャッシュメモリ106に一時的に格納される。そして、圧縮データはSSD105にライトされる。
【0023】
一方、ホストへのリードデータは、SSD105から圧縮された状態でリードされ、まずキャッシュメモリ106に一時的に格納される。その後、LZMA圧縮伸張回路104を通じて平文データへと変換され、平文データもまたキャッシュメモリ106に一時的に格納される。そして、平文データはホストに送信される。
【0024】
このように、データライトはライト完了を返した後に圧縮処理を実行するので、ホストに見えるライト性能は圧縮する・しないにかかわらず一定だが、データリードはホストにデータを返し終わるまで完了しないため、ホストに見えるリード応答性能は、圧縮データの伸張時間に依存する。つまり、LZMA圧縮伸張回路104には高性能な伸張処理が要求される。
【0025】
LZMA圧縮伸張回路104は、例えば、本明細書の一実施形態によるデータ伸張方式に基づいて設計されたハードウェア(論理回路)として実装される。LZMA圧縮伸張回路104が高速なデータ伸張性能を持つことで、ストレージシステム101は、SSDの特徴である高速なランダムリード性能を、非圧縮データだけでなく圧縮データに対しても活かすことができる。LZMA圧縮伸張回路104の機能は、プログラムを実行する複数の処理装置によって実装されてもよい。処理装置は、プロセッサ、プロセッサコア、中央演算装置等を含む。SSDと異なる種類の記憶ドライブ、例えば、HDD(Hard Disk Drive)が使用されてもよい。
【0026】
(2)LZMAアルゴリズム
本明細書の一実施形態のデータ伸張方式を説明するための前提知識として、LZMAアルゴリズムについて図2Aから図5を用いて説明する。
【0027】
(2-1)LZMAアルゴリズムの概要
図2Aは、LZMAアルゴリズムの概要を示す。LZMA圧縮処理では、圧縮前の平文データ201は、最初に辞書圧縮処理202にかけられる。その後で辞書圧縮結果はレンジ符号化処理203にかけられる。これによりLZMA圧縮データ204が生成される。
【0028】
一方、LZMA伸張処理では、圧縮データ204は、最初にレンジ復号処理205にかけられる。その後で復号結果は平文展開処理206にかけられる。これにより元の平文データ201が生成される。
【0029】
(2-2)辞書圧縮処理
図2Bは、LZMAアルゴリズムを構成する辞書圧縮処理202の具体例を示す。平文データ201の文字列ストリームにおいて、同じ文字列が再び出現するかどうかを順番に調べていく。ある文字列が、その先頭文字を起点にしてJ文字前からL文字連続で一致している場合、この文字列をコピー記号[L,J]に変換する。
【0030】
例えば、「b,c,d,e」の4文字の文字列211は、先頭の文字「b」を起点にして6文字前から4文字連続で一致している。この場合、文字列211をコピー記号[4,6]に変換する。同様に、「a,b,a,b」の4文字の文字列212は、先頭の文字「a」を起点にして2文字前から(互いに重なる部分も含めて)4文字連続で一致している。この場合、文字列212をコピー記号[4,2]に変換する。
【0031】
同様に、「c,d,e,f」の4文字の文字列213は、先頭の文字「c」を起点にして14文字前から4文字連続で一致している。この場合、文字列213をコピー記号[4,14]に変換する。これらのコピー記号のデータ量は元の文字列の持つデータ量よりも少ないので、この変換によってデータ量を減らすことができる。
【0032】
一致検索で参照する文字列ストリーム(以下、辞書と呼ぶ)の範囲は、1文字前から所定文字数前までの範囲とする。辞書範囲が検索の度に後方へスライドしていくので、この圧縮技術はスライド辞書型圧縮とも呼ばれる。なお、一致する文字列が辞書範囲内に複数存在する場合は、連続で最も長く一致する文字列をコピー記号に変換する。これは、データ量をより多く減らせる効果がある。
【0033】
後段のレンジ符号化処理203に入力するデータを生成するには、コピー記号に変換されなかった文字(以下、リテラル文字と呼ぶ)とコピー記号とを規定のビットパタンで符号化し、それらを連結してビットストリームにする必要がある。
【0034】
図2Bは、LZMA仕様の規則に従って符号化した結果の、ビットストリームを示す。このビットストリームが、レンジ符号化処理203に入力される。例えば、ビットパタン221は、12ビット長でコピー記号[4,6]を表す。ビットパタン222は、11ビット長でコピー記号[4,2]を表す。ビットパタン223は、13ビット長でコピー記号[4,14]を表す。このように、コピー記号に対応するビットパタン長は固定ではない。一方、リテラル文字は、その文字の8ビット値の先頭に0を1ビット付加した9ビット長のビットパタンによって表されている。
【0035】
レンジ復号処理205は、LZMA伸張処理において、このようなビットストリームを出力する。平文展開処理206では、このようなビットストリームを入力すると、コピー記号やリテラル文字として解釈し、平文データ201の文字列ストリームを復元する。
【0036】
(2-3)レンジ符号化・復号処理
図3Aはレンジ符号化の機能ブロック図を示し、図3Bはレンジ復号の機能ブロック図を示す。図3Aを参照して、レンジ符号化機能300について説明する。エンコーダ301は、入力ビット列302から1ビット単位で入力を受けて、出力コード303を生成する演算ブロックである。図3Aの例において、入力ビット列は「1,1,0,1」である。出力コード303の生成方法は図4A及び4Bを用いて次節で説明する。出力コード303は、LZMAアルゴリズムの圧縮データ(図2AのLZMA204圧縮データ)に相当する。
【0037】
エンコーダ301は、入力として、確率テーブル304から引用される確率値も使用する。その確率値P(x)は、それまでに入力されたビット履歴305がxである時に、入力ビット列302からの次の入力ビットが、“0”である確率を示す。
【0038】
エンコーダ301は、確率値P(x)を使用するたびに学習による適応化を行う。例えば、実際に次の入力ビットが“0”であればP(x)を増やし、“1”であればP(x)を減らす。なお、エンコード開始時で未使用状態での全てのP(x)の値は0.5である(“0”と“1”の確率が均等)。
【0039】
次に、図3Bを参照して、レンジ復号機能310について説明する。デコーダ311は、入力コード312を受けて出力ビット列313を1ビット単位で生成する演算ブロックである。その生成方法は図4A及び4Bを用いて次節で説明する。出力ビット列313はLZMAアルゴリズムの平文展開処理(図2の平文展開処理206)への入力ビットストリーム、すなわち、図2の辞書圧縮処理202からの出力ビットストリームに相当する。
【0040】
デコーダ311は、入力として確率テーブル314から引用される確率値も使用する。その確率値P(x)は、それまでに出力されたビット履歴315がxである時に、次の出力ビットが“0”である確率を示す。
【0041】
エンコーダ301と同様に、デコーダ311は、確率値P(x)を使用するたびに学習による適応化を行う。例えば、実際に次の出力ビットが“0”であればP(x)を増やし、“1”であればP(x)を減らす。なお、デコード開始時で未使用状態での全てのP(x)の値は0.5である(“0”と“1”の確率が均等)。
【0042】
レンジ符号化機能300の出力コード303とレンジ復号機能310の入力コード312が同じ時、確率テーブル304と確率テーブル314の全ての確率値P(x)の学習による変化は同じになる。そのため、符号化時の変化が、復号時に再現される。
【0043】
(2-4)レンジ符号化・復号の原理
図4A及び4Bは、レンジ符号化・復号の原理を説明するための例を示す。図3Aのエンコーダ301が行う符号化処理は、[0、1)の数値軸を、入力されたビット列の各ビット値が“0”である確率に応じた長さで分割し、どちらか一方の区間を次ビット用の分割対象として残すことを繰り返す。符号化処理は、最終的に残った区間に含まれる座標値をコードとして出力する。なお、ビットが“0”の場合は分割した左側の区間を残し、ビットが“1”の場合は分割した右側の区間を残す。また、各ビット値が“0”である確率は、確率テーブル304から、それまでの入力ビット履歴をインデックスにして取得する。
【0044】
LZMAアルゴリズムの規定により、確率値を参照するためのビット履歴は、所定の条件においてクリアされる。例えば、リテラル文字を表す9ビットでは、エンコーダ301は、ヘッダ1ビットを除く8ビットのうち、第1ビットを空(NULL)のビット履歴を用いて符号化する。エンコーダ301は、最後の第8ビットを、第1~7ビットをビット履歴として符号化し、その後にビット履歴をクリアする。
【0045】
図3Bのデコーダ311が行う復号処理は、図4Aや4Bに示すように、[0、1)の数値軸を、出力ビット列の各ビット値が“0”である確率に応じた長さで分割する。さらに、デコーダ311は、入力されたコード(座標値)が、どちらの区間に含まれるかを調べ、出力ビット列の各ビットを確定し、含まれていた区間を次ビット用の分割対象として残すことを繰り返す。そして、最終的に出力ビット列のすべての値を確定する。
【0046】
なお、分割した際に、左側の区間にコードが含まれる場合、デコーダ311はビットが“0”であると確定し、右側の区間にコードが含まれる場合はビットが“1”であると確定する。また、各ビット値が“0”である確率は、確率テーブル314から、それまでの出力ビット履歴をインデックスにして取得する。
【0047】
デコーダ311は、確率値を参照するためのビット履歴のクリアを、符号化と同じ条件で行う。例えば、リテラル文字を表す9ビットでは、デコーダ311は、ヘッダ1ビットを除く8ビットのうち、第1ビットは空(NULL)のビット履歴を用いて復号しする。デコーダ311は、最後の第8ビットは第1~7ビットをビット履歴として復号し、その後にビット履歴をクリアする。
【0048】
図4A及び4Bは、いずれもビット列「1,1,0,1」の符号化・復号処理における数値軸分割の遷移例を示している。ただし、ビット値が“0”である確率の値は異なる。図4Aの例において、“0”である確率値は常に0.5である。図4Bの例において、 “0”である確率値はビット順にそれぞれ0.25、0.25、0.75、0.25である。図4Aは、確率テーブル304や314から参照される確率値が初期状態である場合を示している。図4Bは、確率テーブル304や314から参照される確率値が学習によって変化している場合を示している。
【0049】
レンジ符号化・復号において、ビット列「1,1,0,1」が頻繁に処理されると、確率テーブル304及び314において、最初に「1」が出やすく、履歴が「1」だと次に「1」が出やすく、履歴が「11」だと次に「0」が出やすく、履歴が「110」だと次に「1」が出やすい、ということが学習される。このような確率の学習が進み、ビットの現れ方の予測が当たるようになると、レンジ符号化の出力コードは短くなる。
【0050】
図4Aにおける符号化の流れは以下の通りである。
・第1ステップ:入力「1」に従って右1/2区間[1/2~2/2)が残る。
・第2ステップ:入力「1」に従って右1/2区間[3/4~4/4)が残る。
・第3ステップ:入力「0」に従って左1/2区間[6/8~7/8)が残る。
・第4ステップ:入力「1」に従って右1/2区間[13/16~14/16)が残る。
・最後の区間に含まれる13/16(2進数で1101)を出力コード401とする。
【0051】
一方、図4Bにおける符号化の流れは以下の通りである:
・第1ステップ:入力「1」に従って右3/4区間[1/4~4/4)が残る。
・第2ステップ:入力「1」に従って右3/4区間[7/16~16/16)が残る。
・第3ステップ:入力「0」に従って左3/4区間[28/64~55/64)が残る。
・第4ステップ:入力「1」に従って右3/4区間[139/256~220/256)が残る。
・最後の区間に含まれる3/4(2進数で11)を出力コード411とする。
【0052】
ビット列が確率による予測の通りに入力されるほど、分割で残る区間のサイズは広くなる。そのため、最終的に残った区間に含まれる出力コードの座標値を表現するのに必要なビット数は少なくて済む。図4Aの例は4ビット必要なのに対して、図4Bの例においては、2ビットでよい。このように、レンジ符号はビット履歴に応じたビット出現確率を学習することにより、圧縮率を向上させる。
【0053】
(2-5)レンジ符号化・復号のフローチャート
図5Aは、レンジ符号化の例のフローチャートを示す。図5Bは、レンジ復号の例のフローチャートを示す。まず、図5Aを参照しながら、レンジ符号化の手順を説明する。
【0054】
エンコーダ301は、入力ビット履歴に応じて確率テーブル304から次のビットが“0”である確率値を参照する(501)。エンコーダ301は、その確率値に応じて数値軸レンジ(分割対象レンジ)を2つの区間に分割する(502)。分割する時にレンジサイズと確率値との乗算を実行する。これは、符号化処理において最も時間を要する部分である。そして、エンコーダ301は、入力ビット値が“0”か“1”かに応じて、2つの区間のうち1つの区間を選択する(503)。
【0055】
次にステップ504において、エンコーダ301は、ビットの入力が終了か判定し、ビットの入力が終了ならば(504:YES)、ステップ506に移り、まだ入力があるなら(504:NO)、ステップ505に移る。
【0056】
ステップ505では、エンコーダ301は、確率テーブル304に対して使用した確率値を更新し、次ビットの符号化のためにビット履歴を更新する。確率値の更新は、入力ビット値が“0”なら増やし、“1”なら減らす。ビット履歴の更新は、例えば「11」の次の入力ビットが“0”なら「110」に変更するものである。このあと、エンコーダ301は、ステップ501に戻って符号化処理を継続する。
【0057】
一方、ステップ506では、エンコーダ301は、最後に残った区間を特定する座標値、例えば、当該区間に含まれる値で表現ビット数が最も少ないものをコードとして出力して、符号化処理を終える。
【0058】
図5Bを参照しながら、レンジ復号の例の手順を説明する。デコーダ311は、出力ビット履歴に応じて確率テーブル314を参照して、次のビットが“0”である確率値を取得する(511)。デコーダ311は、その確率値に応じて数値軸レンジを2つの区間に分割する(512)。分割する時にレンジサイズと確率値との乗算を実行する。これは、復号処理において最も時間を要する部分である。そして、デコーダ311は、入力されたコードの値が、2つの区間のうち含まれる区間を選択する(513)。デコーダ311は、その選択区間が表すビット値“0”又は“1”を出力する(514)。
【0059】
次にステップ515において、デコーダ311は、ビットの出力が終了か判定し、終了ならば(515:YES)、復号処理を終え、まだ出力があるなら(515:NO)、ステップ516に移る。
【0060】
ステップ516では、デコーダ311は、確率テーブル314に対して使用した確率値を更新し、次ビットの復号のためにビット履歴を更新する。確率値の更新は、出力ビット値が“0”なら増やし、“1”なら減らすも。ビット履歴の更新は、例えば「11」の次の出力ビットが“0”なら「110」に変更する。このあと、デコーダ311は、ステップ511に戻って復号処理を継続する。
【0061】
(3)レンジ符号化処理の高速化方式
図6はレンジ符号化処理の高速化方式の例の機能ブロック図を示す。図1のLZMA圧縮伸張回路104は、このブロック図が示す圧縮処理を行う。図3A図5Bを参照して説明した例は、1ビット入力するたびに確率を参照して乗算処理を行う。そのため、1回の演算サイクルで1ビットしか処理できず、LZMAアルゴリズムの処理性能が遅い原因となり得る。
【0062】
図6に示すレンジ符号化機能600は、エンコーダを複数同時に動作させることでレンジ符号化処理を高速化する。すなわち、分割対象のレンジをN個用意し(N>1)、入力ビット列からあらかじめN種類のビット履歴を準備しておく。このレンジ符号化機能600は、確率テーブルにおいてN個の確率値を同時に参照し、N個の入力ビットについて乗算処理を並列に実行して、符号化性能をN倍に向上させる。
【0063】
図6は、この高速化技術によるN=4の場合の符号化例を示している。4つのエンコーダ601A~601Dは、いずれも図3Aのエンコーダ301と同様に処理を行う。各エンコーダは、確率テーブル604から確率値を1つずつ取得して使用する。それら4つの確率値は、ビット履歴605A~605Dをインデックスとして参照される。
【0064】
ビット履歴605Aは、入力ビット列602の第1ビット“1”をエンコーダ601Aで処理する際に用いるもので、その値は空(NULL)である。ビット履歴605Bは入力ビット列602の第2ビット“1”をエンコーダ601Bで処理する際に用いるもので、その値は「1」である。
【0065】
ビット履歴605Cは、入力ビット列602の第3ビット“0”をエンコーダ601Cが処理する際に用いされ、その値は「11」である。ビット履歴605Dは、入力ビット列602の第4ビット“1”をエンコーダ601Dが処理する際に用いられ、その値は「110」である。
【0066】
一般化するならば、第Nビットのエンコードに用いるビット履歴は、第1~第(N-1)ビットの連結で構成される。このように4種類のビット履歴を準備しておくことで、4つのエンコーダ601A~601Dは、確率テーブル604から4つの確率値を同時に参照し、それらの確率値を用いて乗算を同時に行うことができる。
【0067】
エンコーダ601A~601Dから出力される4つのサブコード603A~603Dは、最後に連結されて、出力コード606を構成する。出力コード606は、LZMAアルゴリズムの圧縮データに相当する。この方式によれば、1回の演算サイクルで4ビットの入力を処理できるため、LZMAアルゴリズムの圧縮処理におけるレンジ符号化の性能が従来の4倍に向上する。
【0068】
図7は、図6を参照して説明したレンジ符号化の高速化方式のフローチャート例を示す。図7のフローチャートを参照しながら、レンジ符号化の高速化方式の手順を説明する。まず、LZMA圧縮伸張回路104は、入力ビット列のうちのNビットを符号化するのに用いられる、N種類のビット履歴を作成する(701)。Nは2以上の整数である。N個のエンコーダは、それぞれのビット履歴によって、確率テーブルから次のビットが“0”である確率値を取得する(702)。N個のエンコーダは、それらの確率値に応じてN個の数値軸レンジ(分割対象レンジ)をそれぞれ2つの区間に分割する(703)。
【0069】
N個のエンコーダによるレンジサイズと確率値との乗算は、並列で実行される。第1サイクルにおいて、数値軸レンジ(レンジサイズ)はN個のエンコーダに共通であり、図6に示す例において[0、1)である。第2サイクル以降においては、当該エンコードが前回サイクルで選択した区間が対象の数値軸レンジ(レンジサイズ)となる。それぞれのエンコーダは、入力ビット値が“0”か“1”かに応じて、左右2つの区間のうち1つの区間を選択する(704)。
【0070】
次にステップ705において、LZMA圧縮伸張回路104は、ビットの入力が終了か判定し、ビットの入力が終了ならば(705:YES)、ステップ707に移り、まだ入力があるなら(705:NO)、ステップ706に移る。ステップ706では、LZMA圧縮伸張回路104は、確率テーブルに対して使用したN個の確率値を更新する。確率値の更新は、入力ビット値が“0”なら増やし、“1”なら減らす。
【0071】
このあと、LZMA圧縮伸張回路104は、ステップ701に戻って、符号化処理を継続する。例えば、Nが4であり、リテラル文字の8ビットの符号化を行う場合、本フローの第1サイクルは前半4ビットを符号化し、第2サイクルは後半4ビットを符号化する。第2サイクルにおいて、第5ビットの符号化に用いられるビット履歴は、前半4ビットのビット列である。
【0072】
例えば、入力ビット列が6ビットである場合、例えば、第1サイクルは前半4ビット又は3ビットを符号化し、第2サイクルは後半2ビット又は3ビットを符号化してもよい。LZMA圧縮伸張回路104への入力ビット列の最大値は4であり、それ以下のビット列を符号化できる。
【0073】
ステップ707では、それぞれのエンコーダは、最後に残った区間を特定する座標値、例えば当該区間に含まれる値で表現ビット数が最も少ない値を生成する。LZMA圧縮伸張回路104は、それらN個を連結したビット列をコードとして出力し、符号化処理を終える。
【0074】
図6に示したレンジ符号化の例において、整数N>1であり、入力ビット数がNビット、すなわち、ビット履歴の長さが最大(N-1)ビットである。このレンジ符号化は、分割対象のN個のレンジを用いて、符号化をN倍に高速化できる。図7を参照した説明においてリテラル文字の8ビットの例に言及したように、整数M>Nであり、入力ビット数がMビット、すなわち、ビット履歴の長さが最大(M-1)ビットである場合、分割対象のN個のレンジを用いて、入力ビットの符号化を高速化することができる。
【0075】
以下、M=8、N=4の場合を例に、その方法を説明する。LZMA圧縮伸張回路104は、最大7ビットのビット履歴をインデックスとする255エントリの確率テーブルを備える。LZMA圧縮伸張回路104は、8ビットの入力ビット列の前半4ビットの符号化に用いる4種類のビット履歴(それぞれ、空、1ビット、2ビット、3ビット)を準備し、確率テーブルにおいてそれらに対応する4個の確率値を同時に参照する。LZMA圧縮伸張回路104は、それら確率値を用い、第1サイクルで前半4ビットを並列に符号化する。
【0076】
次に、LZMA圧縮伸張回路104は、入力ビットの後半4ビットの符号化に用いる4種類のビット履歴(それぞれ、前半4ビットを先頭に含む、4ビット、5ビット、6ビット、7ビット)を準備し、確率テーブルから対応する4個の確率値を同時に参照する。LZMA圧縮伸張回路104は、それら確率値を用い、第2サイクルで後半4ビットを並列に符号化する。
【0077】
このようにして、LZMA圧縮伸張回路104は、8ビット入力を2サイクル(つまり4倍の性能)で処理し、4つのサブコードを生成し、それを連結することによって出力コードを構成する。
【0078】
一般化すると、Mビットを入力するレンジコードの符号化処理は、最大(M-1)ビットのビット履歴をインデックスとする(2^M-1)エントリの確率テーブルとN個のエンコーダを用いて、[M/N]回の演算サイクルでMビットを処理することで、その性能が向上する。なお、LZMA圧縮伸張回路104は、上記並列処理を行うことなく、サブコードを生成してもよい。
【0079】
(4)レンジ復号処理の高速化方式
レンジ復号処理のN倍の高速化は、図3Bのデコーダ311を単にN個並列に動作させるだけでは実現できない。なぜなら、あるデコーダXの処理で用いるビット履歴は、1つ前のビットを復号するデコーダYが処理結果を出力するまで不確定であるからである。そのため、デコーダXは、確率テーブルからの確率値の参照、その値を用いた乗算をデコーダYのそれと同時に行うことはできず、並列化は実現できない。
【0080】
以下において、本明細書の一実施形態に係る、レンジ復号処理を高速化する方式を説明する。図8は、レンジ復号処理の高速化方式の機能ブロック図を示す。図1のLZMA圧縮伸張回路104は、このブロック図が示すレンジ復号機能800により、伸張処理を行う。
【0081】
図8は、N=4、つまり出力ビット列のビット数が4の場合の、レンジ復号例を示している。15個のデコーダ8A(1個)、8B0及び8B1(2個)、8C00~8C11(4個)、8D000~8D111(8個)は、いずれも図3Bのデコーダ311と同様に処理を行う。図8では、一部のデコーダの図示が省略されている。これら15個のデコーダに入力される4つのサブコード803A~803Dは、入力コード802(LZMAアルゴリズムの圧縮データに相当)から分離されたものであり、図6の4つのサブコード603A~603Dと同じである。なお、1つのサブコードが、複数のデコーダに共有されることがある。
【0082】
各デコーダは、確率テーブル804から確率値を1つずつ取得して使用して、候補ビット値を出力する。それら15個の確率値は、可能性のあるビット履歴の全通りをインデックスとして参照された値である。
【0083】
出力ビット列806の第1ビットを復号するための1個のデコーダ8Aが用いるビット履歴の値は空(NULL)である。出力ビット列806の第2ビットを復号するための2個のデコーダ8B0及び8B1が用いるビット履歴の値は、それぞれ「0」及び「1」である。
【0084】
出力ビット列806の第3ビットを復号するための4個のデコーダ8C00~8C11が用いるビット履歴の値は、それぞれ「00」、「01」、「10」、「11」である。出力ビット列806の第4ビットを復号するための8個のデコーダ8D000~8D111が用いるビット履歴の値は、それぞれ「000」、「001」、「010」、「011」、「100」、「101」、「110」、「111」である。
【0085】
一般化するならば、第Kビットのデコードに用いるビット履歴の数は、2^(K-1)個である。各ビット履歴は、出力ビット列806の第1~第(K-1)ビットとして可能性のある、(K-1)ビットのビットパタン(ビット列)である。このように15種類のビット履歴を準備しておくことで確率テーブル804から15個の確率値が同時に参照され、15個のデコーダはそれらの確率値を用いた乗算を同時に行う。
【0086】
デコーダ8Aが出力する、出力ビット列806の第1ビットが「1」であった場合、デコーダ8B0及び8B1のうち、第1ビットが「1」であると仮定して復号を行ったデコーダ8B1が出力する第2ビットが正しい結果であることがわかる。そこで、セレクタ805Bは、デコーダ8B0及び8B1が出力する2個の第2ビット候補のうち、デコーダ8B1が出力する「1」を選択する。すなわち、第1及び第2ビットが、「11」と確定する。
【0087】
これにより、デコーダ8C00~8C11のうち、第1及び第2ビットが「11」であると仮定してデコードを行ったデコーダ8C11が出力する第3ビットが、正しい結果であることがわかる。そこで、セレクタ805Cは、デコーダ8C00~8C11が出力する4個の第3ビット候補のうち、デコーダ8C11が出力する「0」を選択する。すなわち、第1~第3ビットが、「110」と確定する。
【0088】
これにより、デコーダ8D000~8D111のうち、第1~第3ビットが「110」であると仮定してデコードを行ったデコーダ8D110が出力する第4ビットが、正しい結果であることがわかる。そこで、セレクタ805Dは、デコーダ8D000~8D111が出力する8個の第4ビット候補のうち、デコーダ8D110が出力する「1」を選択する。
【0089】
以上によって、出力ビット列806の4ビットが「1101」であることが確定する。一般化するならば、LZMA圧縮伸張回路104は、第Kビットをデコードするために2^(K-1)個のデコーダを備え、それらが出力する2^(K-1)個の第Kビット候補を保持しておく。LZMA圧縮伸張回路104は、すでに確定した第1~第(K-1)ビットの値がビット履歴であると仮定してデコードを行った1つのデコーダが出力した候補を、第Kビットとして選択する。
【0090】
セレクタ805B~805Dによるビット選択処理は、デコーダの乗算処理に比べて十分短い時間で行われる。したがって、この方式によれば1回の演算サイクルで4ビットの出力を処理できる。そのため、LZMAアルゴリズムの伸張処理におけるレンジ復号処理の性能が従来の4倍に向上する。
【0091】
図9を参照しながら、図8を参照して説明したレンジ復号の高速化方式の手順を以下に示す。まず、LZMA圧縮伸張回路104は、出力ビット列のうちのNビットを復号するために用いる可能性のある、(2^N―1)個のビット履歴を作成する(901)。第Kビットの復号に用いられるビット履歴は2^(K-1)個である。
【0092】
(2^N―1)個のデコーダは、それぞれが受け持つビット履歴に応じて確率テーブル804から次のビットが“0”である確率値を取得し(902)、その確率値に応じて数値軸レンジ(分割対象レンジ)を2つの区間に分割する(903)。第Kビットの復号に用いられる2^(K-1)個のデコーダが分割する数値軸レンジは共通である。具体的には、第1サイクルにおいて全てのデコータの数値軸レンジは共通であり、図8の例において[0,1)である。第2サイクル以降において、第Kビットのデコーダの数値軸レンジは、前回サイクルにおける第Kビットの正解を出力したデコーダによる分割結果のレンジである。分割する時に、レンジサイズと確率値との乗算を実行する。
【0093】
デコーダは、入力されたサブコードの値が、2つの区間のうち含まれる区間を選択し(904)、その選択区間が表すビット値“0”又は“1”を生成する(905)。なお、生成されるビット値の個数は(2^N―1)個であり、第Kビットの候補数は2^(K―1)個である。そして、セレクタは、第1ビットから順にそれぞれの候補から正解のビットを1つ選択し、Nビットのパタンを決定して出力する(906)。なお、第Kビットの正解値の選択には、第1~第(K-1)ビットの正解値をビット履歴として用いる。
【0094】
次にステップ906において、LZMA圧縮伸張回路104は、ビットの出力が終了か判定し、終了ならば(906:YES)、復号処理を終え、まだ出力があるなら(906:NO)、ステップ907に移る。
【0095】
ステップ907では、LZMA圧縮伸張回路104は、確率テーブル804に対して使用したN個の確率値を更新する。確率値の更新は、出力ビット値が“0”なら増やし、“1”なら減らすものである。さらに、LZMA圧縮伸張回路104は、正解のビット値を出力したデコーダがステップ904で選択した区間を、次のサイクルの数値軸レンジとして採用する。第Kビットのための2^(K―1)個のデコーダのうち第Kビットの正解値を出力した1つのデコーダがステップ904で選択した区間が、次回の第Kビットのデコードにおいてステップ903で分割される数値軸レンジとして採用される。
【0096】
このあと、LZMA圧縮伸張回路104は、ステップ901に戻って復号処理を継続する。例えば、リテラル文字の8ビットについて、前半4ビットと後半4ビットが、二つのサイクルで符号化されている場合、本フローの第2サイクルで第5ビットの復号に用いられるビット履歴は、前半4ビットのビット列である。
【0097】
例えば、6ビット入力データが、前半4ビット及び残り2ビットに分けて2サイクルで符号化されている場合、LZMA圧縮伸張回路104は、第1サイクルで4ビット又は3ビットを復号した後、第2サイクルで2ビット又は3ビットを復号してよい。LZMA圧縮伸張回路104への入力ビット列の最大値は4であり、それ以下のビット列を復号できる。
【0098】
図8に示したレンジコードの復号処理の高速化方式では、整数N>1において、入力ビット数がNビット(すなわち、ビット履歴の長さが最大(N-1)ビット)であり、分割対象のレンジをN個用いて、N倍に高速化する。図9を参照してリテラル文字の8ビットの例に言及したように、整数M>Nであり、入力ビット数がMビット、すなわち、ビット履歴の長さが最大(M-1)ビットである場合、分割対象のレンジをN個用いて、出力ビット列の復号を高速化することができる。
【0099】
以下、8ビットの出力ビット列を復号する例を説明する。LZMA圧縮伸張回路104は、図8と同様に15個のデコーダを備え、これら15個のデコーダに入力コード(LZMAアルゴリズムの圧縮データに相当)から分離した、4つのサブコードを図8と同様に入力する。各デコーダは、最大7ビットのビット履歴をインデックスとする255エントリの確率テーブルから確率値を1つずつ取得して使用する。
【0100】
第1サイクルにおいて参照する15個の確率値は、8ビットの出力ビット列の前半4ビットとして可能性のあるビット履歴の全通り(それぞれ、空、1ビット、2ビット、3ビット)をインデックスとして参照された値である。出力ビット列の第1ビットを復号する1個のデコーダが用いるビット履歴の値は、空(NULL)である。
【0101】
出力ビット列の第2ビットを復号する2個のデコーダが用いるビット履歴の値は、それぞれ「0」と「1」である。出力ビット列の第3ビットを復号する4個のデコーダが用いるビット履歴の値はそれぞれ「00」、「01」、「10」、「11」である。出力ビット列の第4ビットを復号する8個のデコーダが用いるビット履歴の値はそれぞれ「000」、「001」、「010」、「011」、「100」、「101」、「110」、「111」である。
【0102】
15個のデコーダは、それらのビット履歴で参照した確率値を用いた乗算を並列に行う。そして、図8と同様に、セレクタのビット選択処理が、第1ビットから第4ビットまでの値を順に確定させる。ここでは例えば「1101」とする。
【0103】
次に、第2サイクルにおいて参照する15個の確率値は、8ビットの出力ビット列の後半4ビットとして可能性のあるビット履歴の全通り(それぞれ、第1サイクルで確定した「1101」を頭に含む、4ビット、5ビット、6ビット、7ビット)をインデックスとして参照した値である。
【0104】
出力ビット列の第5ビットを復号する1個のデコーダが用いるビット履歴の値は、「1101」である。出力ビット列の第6ビットを復号する2個のデコーダが用いるビット履歴の値は、それぞれ、「11010」と「11011」である。出力ビット列の第7ビットを復号する4個のデコーダが用いるビット履歴の値は、それぞれ、「110100」、「110101」、「110110」、「110111」である。
【0105】
出力ビット列の第8ビットを復号する8個のデコーダが用いるビット履歴の値は、それぞれ、「1101000」、「1101001」、「1101010」、「1101011」、「1101100」、「1101101」、「1101110」、「1101111」である。
【0106】
15個のデコーダはそれらのビット履歴で参照した確率値を用いた乗算を並列に行う。そして、図8と同様に、セレクタのビット選択処理が、第5ビットから第8ビットまでの値を順に確定させる。
【0107】
図8と同様に、セレクタのビット選択処理はデコーダの乗算処理に比べて十分短い時間で行われる。したがって、この方式によれば2回の演算サイクルで8ビットの出力を処理できる。上述のように、255エントリの確率テーブルにおいて、第1サイクルでは15エントリを参照し、第2サイクルでは残りの240エントリから15エントリを選択して参照する。第2サイクルでは、第1サイクルで確定した前半4ビットを含むビット履歴でインデックスすることにより、参照するエントリ数が1/16にしぼられる。
【0108】
一般化すると、Mビットを出力するレンジコードの復号処理は、最大(M-1)ビットのビット履歴をインデックスとする(2^M-1)エントリの確率テーブルと(2^N-1)個のデコーダを用いて、[M/N]回の演算サイクルでMビットを処理することで、その性能が向上する。
【0109】
上述のように、本明細書の一実施形態は、レンジ符号により圧縮されたデータを高速に伸張することができる。そのため、例えば、レンジ符号アルゴリズムによるデータ圧縮機能を有する装置ストレージシステムにおいて、圧縮されたデータのリード応答性能を向上させることができる。
【0110】
なお、本発明は上記した実施形態に限定されるものではなく、様々な変形例が含まれる。例えば、上記した実施形態は本発明を分かりやすく説明するために詳細に説明したものであり、必ずしも説明したすべての構成を備えるものに限定されるものではない。また、ある実施形態の構成の一部を他の実施形態の構成に置き換えることが可能であり、また、ある実施形態の構成に他の実施形態の構成を加えることも可能である。また、各実施形態の構成の一部について、他の構成の追加・削除・置換をすることが可能である。
【0111】
また、上記の各構成・機能・処理部等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、上記の各構成、機能等は、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、SSD(Solid State Drive)等の記録装置、または、ICカード、SDカード等の記録媒体に置くことができる。
【0112】
また、制御線や情報線は説明上必要と考えられるものを示しており、製品上必ずしもすべての制御線や情報線を示しているとは限らない。実際には殆どすべての構成が相互に接続されていると考えてもよい。
【0113】
〔付記〕
以下において、本開示のいくつかの態様を記載する。
(1)
受信したデータを処理する装置であって、
レンジ符号に基づき圧縮された入力コードを受信する回路と、
前記入力コードの一部又は全部を伸張して、Nビット列を復号する伸張回路と、
を含み、
前記Nは1より大きい整数、Kは1からNの各整数を表し、
前記入力コードの第Kビットのビット値は、前記第Kビットより前のビットのビット履歴に基づき復号されるものであり、
前記伸張回路は、
前記Nビット列のビットの候補ビット値について、前記第Kビットより前のビットの取りうる複数通りのビット履歴に基づき複数の候補ビット値をそれぞれ算出することを、複数のビットに対して並列に行い、
前記第Kビットの正解ビット値を、前記複数の候補ビット値から、前記第Kビットより前の正解ビット履歴に基づき選択することを繰り返して、前記Nビット列を復号する、装置。
(2)
(1)に記載の装置であって、
前記伸張回路は、
前記ビット履歴に応じて現れるビット値の確率値を格納し、
格納されている前記確率値において、復号された前記Nビット列を構成する正解ビットが基づくビット履歴に対応する確率値を選択して更新する、装置。
(3)
(1)に記載の装置であって、
前記Nビット列における第Kビットの候補ビット値の算出は、2^(K-1)通りのビット履歴それぞれの確率値による分割対象レンジに対する乗算を実行して二つの区画に分割し、前記入力コードにおける前記第Kビットの前記二つの区画のうちサブコードにより特定される区画から2^(K-1)通りそれぞれの候補ビット値を決定する、装置。
(4)
(1)に記載の装置であって、
前記伸張回路は、前記入力コード全体から復号するビット数が、予め設定された最大値よりも大きい場合、前記入力コードの一部からのビット列の復号を、複数サイクル実行する、装置。
(5)
(4)に記載の装置であって、
前記複数サイクルにおける第2サイクル以降のサイクルにおいて、前記第Kビットの候補ビット値それぞれを決定するための分割対象レンジは、直前のサイクルにおける前記第Kビットの正解ビット値に対する区画である、装置。
(6)
ストレージシステムであって、
ホストからの要求を受信するインタフェースと、
前記ホストからのコマンドに応じて記憶ドライブへのデータの書き込み及び前記記憶ドライブからのデータの読み出しを実行するコントローラと、を含み、
前記コントローラは、(1)に記載の伸張回路を含み、
前記コントローラは、前記ホストからのリードコマンドに応じて前記記憶ドライブから転送された前記入力コードを前記伸張回路によって復号してリードデータを生成し、
前記リードデータを、前記インタフェースを介して前記ホストに返す、ストレージシステム。
(7)
(6)に記載のストレージシステムであって、
前記伸張回路は、
前記ビット履歴に応じて現れるビット値の確率値を格納し、
格納されている前記確率値において、復号された前記Nビット列を構成する正解ビット値それぞれの確率値を選択して更新する、ストレージシステム。
(8)
(6)に記載のストレージシステムであって、
前記Nビット列における第Kビットの候補ビット値の算出は、2^(K-1)のビット履歴それぞれの確率値による分割対象レンジに対する乗算を実行して二つの区画に分割し、前記入力コードにおける前記第Kビットのサブコードに対する2^(K-1)個の区画それぞれから候補ビット値を決定する、ストレージシステム。
(9)
(6)に記載のストレージシステムであって、
前記伸張回路は、前記入力コード全体から復号するビット数が、予め設定された最大値よりも大きい場合、前記入力コードの一部からのビット列の復号を、複数サイクル実行する、ストレージシステム。
(10)
(6)に記載のストレージシステムであって、
前記複数サイクルにおける第2サイクル以降のサイクルにおいて、前記第Kビットの候補ビット値それぞれを決定するための分割対象レンジは、直前のサイクルにおける前記第Kビットの正解ビット値に対する区画である、ストレージシステム。
(11)
レンジ符号に基づき圧縮された入力コードの一部又は全部を伸張して、Nビット列を復号する方法であって、
前記Nは1より大きい整数、Kは1からNの各整数を表し、
前記方法は、
前記Nビット列のビットそれぞれの候補ビット値を並列に算出し、前記Nビット列における第Kビットの候補ビット値の算出は、ビット履歴それぞれの確率値による分割対象レンジに対する乗算を実行して二つの区画に分割し、前記入力コードにおける前記第Kビットのサブコードに対する区画それぞれから候補ビット値を決定し、
前記第Kビットの正解ビット値を、前記候補ビット値から、前記第Kビットより前の正解ビット履歴に基づき選択して、前記Nビット列を復号する、方法。
(12)
(11)に記載の方法であって、
予め設定されている前記確率値において、復号された前記Nビット列を構成する正解ビット値それぞれの確率値を選択して更新する、方法。
(13)
(11)に記載の方法であって、
前記Nビット列における第Kビットの候補ビット値の算出は、2^(K-1)のビット履歴それぞれの確率値による分割対象レンジに対する乗算を実行して二つの区画に分割し、前記入力コードにおける前記第Kビットのサブコードに対する2^(K-1)個の区画それぞれから候補ビット値を決定する、方法。
(14)
(11)に記載の方法であって、
前記入力コード全体から復号するビット数が、予め設定された最大値よりも大きい場合、前記入力コードの一部からのビット列の復号を、複数サイクル実行する、方法。
(15)
(14)に記載の方法であって、
前記複数サイクルにおける第2サイクル以降のサイクルにおいて、前記第Kビットの候補ビット値それぞれを決定するための分割対象レンジは、直前のサイクルにおける前記第Kビットの正解ビット値に対する区画である、方法。
【符号の説明】
【0114】
101…ストレージシステム、103…ストレージコントローラ、104…LZMA圧縮伸張回路、301、601A~D…エンコーダ、311、8A、8B0、8B1、8C00、8C11、8D000、8D111…デコーダ、304、314、604、804…確率テーブル、302、602…入力ビット列、303、606…出力コード、312、802…入力コード、313、806…出力ビット列
図1
図2A
図2B
図3A
図3B
図4A
図4B
図5A
図5B
図6
図7
図8
図9