(57)【要約】      （修正有）【課題】仮想通貨やブロックチェーンのプルーフ・オブ・ワークのハッシュ計算処理をより高速化する並列処理を実行可能な情報処理装置を提供する。【解決手段】グラフィックボードに搭載されるグラフィック処理ユニットＧＰＵが有する多数のコアのそれぞれに、プルーフ・オブ・ワークに必要なＮｏｎｃｅ値を異ならせた入力データに対するハッシュ計算処理を行わせる。各コアについても、入力データを分割した分割データに対する処理を、ビットスライス実装によって並列的に行う。【効果】通常処理に比べてステップ数を削減し、高速化を図ることができる。【選択図】図１０
2019159183.tif 000002
【特許請求の範囲】
【請求項１】
ハッシュ演算を行う情報処理装置であって、
外部装置から新たなブロック情報を取得する取得手段と、
前記新たなブロック情報と、前ブロックのハッシュ値と、所定の固定長データと、を合わせた対象データのハッシュ値を演算し、前記ハッシュ値が所定条件を満たす値となる固定長データを探索するハッシュ処理手段と、を備え、
前記ハッシュ処理手段は、複数の演算手段によって構成されて、前記固定長データを異ならせた複数の対象データに対して、前記複数の演算手段によってそれぞれハッシュ値を演算可能であり、
各演算手段は、前記対象データに基づくｎ個のｍビットのビット列データを並列的に処理可能であることを特徴とする情報処理装置。
【請求項２】
請求項１に記載の情報処理装置において、
データを記憶する記憶手段と、
前記ｎ個のｍビットのビット列データを前記記憶手段から取得し、ｍ個のｎビットのビット列データに変換して前記記憶手段に格納するデータ再配置手段と、を備え、
前記データ再配置手段は、前記ｎ個のｍビットのビット列データａ［ｉ，ｊ］∈｛０，１｝，（１≦ｉ≦ｍ；１≦ｊ≦ｎ）に対し１個目のビット列データを（ａ［ｍ，１］｜｜．．．｜｜ａ［２，１］｜｜ａ［１，１］）、２個目のビット列データを（ａ［ｍ，２］｜｜．．．｜｜ａ［２，２］｜｜ａ［１，２］）、ｎ個目のビット列データを（ａ［ｍ，ｎ］｜｜．．．｜｜ａ［２，ｎ］｜｜ａ［１，ｎ］）としたときに、前記ｎ個のｍビットのビット列データを再配置して１個目のビット列データを（ａ［１，ｎ］｜｜．．．｜｜ａ［１，２］｜｜ａ［１，１］）、２個目のビット列データを（ａ［２，ｎ］｜｜．．．｜｜ａ［２，２］｜｜ａ［２，１］）、ｍ個目のビット列データを（ａ［ｍ，ｎ］｜｜．．．｜｜ａ［ｍ，２］｜｜ａ［ｍ，１］）とした前記ｍ個のｎビットのビット列データを生成し、
前記演算手段は、前記データ再配置手段によって生成された前記ｍ個のｎビットのビット列データを、ｎビットを１ワードとしてワード単位で相互に演算してｓ個のｎビットのビット列データを算出し、
前記演算手段によって算出された前記ｓ個のｎビットのビット列データが、特定の特徴を有するか否かを判定する判定手段をさらに備えることを特徴とする情報処理装置。
【請求項３】
請求項２に記載の情報処理装置において、
前記判定処理手段は、前記ｓ個のｎビットのビット列データｂ［ｉ，ｊ］∈｛０，１｝，（１≦ｉ≦ｓ；１≦ｊ≦ｎ）に対し１個目のビット列データを、（ｂ［１，ｎ］｜｜．．．｜｜ｂ［１，２］｜｜ｂ［１，１］）、２個目のビット列データを、（ｂ［２，ｎ］｜｜．．．｜｜ｂ［２，２］｜｜ｂ［２，１］）、ｓ個目のビット列データを（ｂ［ｓ，ｎ］．．．ｂ［ｓ，２］｜｜ｂ［ｓ，１］）としたときに、ｓビット（ｂ［ｓ，ｊ］｜｜．．．｜｜ｂ［２，ｊ］｜｜ｂ［１，ｊ］），（１≦ｉ≦ｎ）間のデータ相関を判定することを特徴とする情報処理装置。
【請求項４】
請求項２に記載の情報処理装置において、
前記判定処理手段は、前記ｓ個のｎビットのビット列データｂ［ｉ，ｊ］∈｛０，１｝，（１≦ｉ≦ｓ；１≦ｊ≦ｎ）に対し、ｓビット（ｂ［ｓ，ｉ］｜｜．．．｜｜ｂ［２，ｉ］｜｜ｂ［１，ｉ］），（１≦ｉ≦ｎ）のビット列データの上位ｔビットが全てゼロｂ［ｉ，ｊ］＝０，（ｓ−ｔ＋１≦ｉ≦ｓ；１≦ｊ≦ｎ）であるか否かを判定することを特徴とする情報処理装置。
【請求項５】
請求項１に記載の情報処理装置において、
データを記憶する記憶手段と、
前記ｎ個のｍビットのビット列データを前記記憶手段から取得し、ｍ個のｎビットのビット列データに変換して前記記憶手段に格納するとともに、ｓ個のｎビットのビット列データを前記記憶手段から取得し、ｎ個のｓビットのビット列データに変換して前記記憶手段に格納するデータ再配置手段と、を備え、
前記データ再配置手段は、前記ｎ個のｍビットのビット列データａ［ｉ，ｊ］∈｛０，１｝，（１≦ｉ≦ｍ；１≦ｊ≦ｎ）に対し１個目のビット列データを（ａ［ｍ，１］｜｜．．．｜｜ａ［２，１］｜｜ａ［１，１］）、２個目のビット列データを（ａ［ｍ，２］｜｜．．．｜｜ａ［２，２］｜｜ａ［１，２］）、ｎ個目のビット列データをａ［ｍ，ｎ］｜｜．．．｜｜ａ［２，ｎ］｜｜ａ［１，ｎ］）としたときに、前記ｎ個のｍビットのビット列データを再配置して１個目のビット列データを（ａ［１，ｎ］｜｜．．．｜｜ａ［１，２］｜｜ａ［１，１］）、２個目のビット列データを（ａ［２，ｎ］｜｜．．．｜｜ａ［２，２］｜｜ａ［２，１］）、ｍ個目のビット列データを（ａ［ｍ，ｎ］｜｜．．．｜｜ａ［ｍ，２］｜｜ａ［ｍ，１］）とした前記ｍ個のｎビットのビット列データを生成し、
前記演算手段は、前記データ再配置手段によって生成された前記ｍ個のｎビットのビット列データを、ｎビットを１ワードとしてワード単位で相互に演算してｓ個のｎビットのビット列データを算出し、
前記データ再配置手段は、
前記演算手段によって算出された前記ｓ個のｎビットのビット列データｂ［ｉ，ｊ］∈｛０，１｝，（１≦ｉ≦ｓ；１≦ｊ≦ｎ）に対し１個目のビット列データを（ｂ［１，ｎ］｜｜．．．｜｜ｂ［１，２］｜｜ｂ［１，１］）、２個目のビット列データを（ｂ［２，ｎ］｜｜．．．｜｜ｂ［２，２］｜｜ｂ［２，１］）、ｓ個目のビット列データを（ｂ［ｓ，ｎ］｜｜．．．｜｜ｂ［ｓ，２］｜｜ｂ［ｓ，１］）としたときに、前記ｓ個のｎビットのビット列データを再配置して１個目のビット列データを（ｂ［ｓ，１］｜｜．．．｜｜ｂ［２，１］｜｜ｂ［１，１］）、２個目のビット列データを（ｂ［ｓ，２］｜｜．．．｜｜ｂ［２，２］｜｜ｂ［１，２］）、ｎ個目のビット列データを（ｂ［ｓ，ｎ］｜｜．．．｜｜ｂ［２，ｎ］｜｜ｂ［１，ｎ］）とした前記ｎ個のｓビットのビット列データを生成し、
前記データ再配置手段によって生成された前記ｎ個のｓビットのビット列データが、特定の特徴を有するか否かを判定する判定手段をさらに備えることを特徴とする情報処理装置。
【請求項６】
請求項５に記載の情報処理装置において、
前記判定処理手段は、前記ｎ個のｓビットのビット列データｂ［ｉ，ｊ］∈｛０，１｝，（１≦ｉ≦ｓ；１≦ｊ≦ｎ）に対し、ｓビット（ｂ［ｓ，ｊ］｜｜．．．｜｜ｂ［２，ｊ］｜｜ｂ［１，ｊ］），（１≦ｊ≦ｎ）間のデータ相関を判定することを特徴とする情報処理装置。
【請求項７】
請求項５に記載の情報処理装置において、
前記判定処理手段は、前記ｎ個のｓビットのビット列データｂ［ｉ，ｊ］∈｛０，１｝，（１≦ｉ≦ｓ；１≦ｊ≦ｎ）に対し、ｓビット（ｂ［ｓ，ｊ］｜｜．．．｜｜ｂ［２，ｊ］｜｜ｂ［１，ｊ］），（１≦ｊ≦ｎ）のビット列データの上位ｔビットが全てゼロｂ［ｉ，ｊ］＝０，（ｓ−ｔ＋１≦ｉ≦ｓ；１≦ｊ≦ｎ）であるか否かを判定することを特徴とする情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置に関し、特に、暗号技術を利用したブロックチェーンや仮想通貨のプルーフ・オブ・ワーク処理を高速化する装置に関する。
【背景技術】
【０００２】
近年、中央銀行が発行し国家が管理する法定通貨に対し、インターネット通信を利用して国家間をまたがって利用できる仮想通貨と呼ばれる通貨が注目されている。
仮想通貨には暗号技術を用いた仕組みが提供されており、その一つにブロックチェーンと呼ばれる技術が存在する（特許文献１）。
ブロックチェーンでは、データ（取引記録）の真正性を担保するために、新たな取引記録を含むデータブロックをブロックチェーンに接続しようとする場合、その前のデータブロックのハッシュ値を含めたブロックを接続するという方法が採用されている。
既に確定しているデータブロックを含めて、新たなデータブロックを接続することによって、既に確定して接続されているデータブロックはより一層改ざんしにくくなるからである。
そして、この確定操作に暗号的ハッシュアルゴリズムを利用し、ハッシュアルゴリズムの計算結果（ハッシュ値）に特定の特徴を有する値を要求する。
【０００３】
暗号的ハッシュアルゴリズムは、入力値から出力値を算出することは容易だが、出力値から入力値を算出することが困難であるという性質を有する。
このため、確定操作には、例えば入力値にランダムなデータ列（ｎｏｎｃｅ）を加え、ｎｏｎｃｅの値を変えながら、ハッシュ計算を繰り返し、特定の出力となるまで計算を繰り返す、といった処理が必要となる。そして、この特定の出力は、例えば、ハッシュ値の出力データにおいて先頭から０が複数個連続する、といった性質を有するものである。
【０００４】
例えば、先頭から０がｎ個連続するハッシュ値を算出する場合、暗号的ハッシュアルゴリズムの性質から平均すると２のｎ−１乗の試行が必要であることはよく知られている。そして、この値ｎはデータブロックの改ざんを困難にするために比較的大きくとるように調整される。
この確定操作は膨大な計算量が必要であり、プルーフ・オブ・ワークと呼ばれている。
特に仮想通貨の場合にはこの計算をした者に対して報酬を与える、という仕組みが提供されている。
【０００５】
このようなプルーフ・オブ・ワークの計算処理を高速化するために並列計算が従来行われている。
最近のＣＰＵは複数のコアを搭載しており、この複数のコアに対して、同時にハッシュ計算をさせることによって計算にかかる時間を短縮することができる。
また、グラフィックボードなどに搭載されるＧＰＵはより多くのコアを持つものがあり、それらに同時にハッシュ計算を依頼することにより、ＣＰＵよりもより短時間で多くのハッシュ計算を行うことができるものも存在する。
ブロックチェーンにおけるプルーフ・オブ・ワークのハッシュ値計算は、複数の入力値を並列して計算できる性質を有するため、複数コアによる並列計算が非常に有効である。
【０００６】
プルーフ・オブ・ワークの計算処理を高速化するもう一つの方法として、ＡＳＩＣ（Application Specific Integrated Circuit）などの専用回路を使う方法が知られている。
複数ビットを１ワードとして演算処理を行うＣＰＵやＧＰＵに対して、専用の回路を用いるＡＳＩＣでは、ビット処理を主体とする特徴を有するハッシュアルゴリズムに対しては回路規模を小さくすることができ、ＣＰＵやＧＰＵでは、ワード処理で無駄になるビットもなく効率的な実装が可能となる。結果としてハッシュ計算を高速化することが可能となる。
暗号的ハッシュアルゴリズムとしては、一般的に用いられているＳＨＡ−２ファミリーと呼ばれるもの（ＳＨＡ−２４４、ＳＨＡ−２５６、ＳＨＡ−３８４、ＳＨＡ−５１２）がある。また、最近の標準化されてものとしてＳＨＡ−３が存在する。
ＳＨＡ−２ファミリーはビット処理が多用されており、ＡＳＩＣによる実装が効果的であることがよく知られている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１７−９１１４８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、ＡＳＩＣなどの専用回路を使う方法は、ＳＨＡ−３のようなセル単位の状態遷移を基本とした演算によって組み立てられているハッシュアルゴリズムや、メモリーを多用するハッシュアルゴリズムにおいては、演算回路が複雑になり、回路規模が大きくなって十分な高速化を得ることが難しいといった問題があった。
また、ＣＰＵやＧＰＵによる並列計算では、ビット処理を必要とする演算が含まれる場合には、ワード内の使用ビット以外の演算処理が無駄になり、ＡＳＩＣでは配線の繋ぎ変えで実現可能なビット転置処理にも特定の演算処理が必要となるため、計算処理に時間を有し、十分な高速化が得られない、という問題があった。
本発明は、このような現状を鑑みてなされたものであり、仮想通貨やブロックチェーンのプルーフ・オブ・ワークの計算処理をより高速に実行可能な情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明は、上述の課題を解決するためになされたものであり、ハッシュ演算を行う情報処理装置であって、外部装置から新たなブロック情報を取得する取得手段と、前記新たなブロック情報と、前ブロックのハッシュ値と、所定の固定長データと、を合わせた対象データのハッシュ値を演算し、前記ハッシュ値が所定条件を満たす値となる固定長データを探索するハッシュ処理手段と、を備え、前記ハッシュ処理手段は、複数の演算手段によって構成されて、前記固定長データを異ならせた複数の対象データに対して、前記複数の演算手段によってそれぞれハッシュ値を演算可能であり、各演算手段は、前記対象データに基づくｎ個のｍビットのビット列データを並列的に処理可能である情報処理装置を特徴とする。
【発明の効果】
【００１０】
上記のように構成することにより、本発明によれば、仮想通貨やブロックチェーンのプルーフ・オブ・ワークの計算処理をより高速に実行可能な情報処理装置を実現することが出来る。
【図面の簡単な説明】
【００１１】
【図１】本実施形態に係る情報処理装置を含むブロックチェーンネットワークを示す図である。
【図２】本実施形態に係る情報処理装置の構成を説明するブロック図である。
【図３】本実施形態の情報処理装置が備えるグラフィックボードの構成を示す図である。
【図４】ビットスライス実装のデータ配置を例示する図である。
【図５】ＳＨＡ−３のＳｔａｔｅ  Ａｒｒａｙを示す図である。
【図６】本実施形態の情報処理装置においてハッシュ計算を行うための処理を説明する図である。
【図７】本実施形態の情報処理装置においてハッシュ計算を行うための処理を説明する図である。
【図８】本実施形態の情報処理装置におけるＲＡＭ上のデータ再配置を説明する図である。
【図９】イーサリアムにおけるＳＨＡ−３処理の実装コードを示す図である。
【図１０】本実施形態の情報処理装置のＣＰＵが実行する処理を説明するフローチャートである。
【発明を実施するための形態】
【００１２】
以下に、図面を参照して本発明の実施の形態を詳細に説明する。
プルーフ・オブ・ワークを採用した暗号通貨（仮想通貨）のマイニングでは、暗号的ハッシュ関数の出力（ハッシュ値）が特定の条件を満たす入力値（Ｎｏｎｃｅ値）を、他者に先駆けていかに速く算出できるかが勝敗を分ける。プルーフ・オブ・ワークでは、最初に正解のＮｏｎｃｅ値を報告した者のみに報酬として仮想通貨を受け取る権利が与えられるからである。
マイニングのハッシュ関数の計算は、インプット（現ブロックのデータ、前ブロックのハッシュ値）にランダムなＮｏｎｃｅ値を加えて計算するのみであり、各ハッシュ関数の計算を独立に行うことができるため、Ｎｏｎｃｅ値を異ならせて同時且つ並列的に計算を行うことが出来る。
仮想通貨の主流と言えるビットコインでは、ＳＨＡ−２を利用しており、そのアルゴリズムがシンプルであるため、ＡＳＩＣによる実装が有効である。
【００１３】
一方で、ビットコインの後発であるオルトコインには、イーサリアム（Ethereum）などＳＨＡ−３ベースのハッシュアルゴリズムを使用しているものが多い。
このＳＨＡ−３は、ＳＨＡ−２と比較してもより複雑な演算を行い、多くのメモリー容量を要求するためＡＳＩＣによる実装による効果が出にくいとされる。
本実施形態に係る情報処理装置では、多数のコアを備えるＧＰＵによるＳＩＭＤ演算によって、Ｎｏｎｃｅ値を異ならせた多数のインプットのハッシュ計算を行うとともに、各コアにおいても、ビットスライス実装によって並列的な処理を行うことで、超並列的なハッシュ処理を可能とする。それにより、暗号通貨のマイニングをより有利に行うことが出来る。
【００１４】
図１は、本実施形態に係る情報処理装置を含むブロックチェーンネットワークを示す図である。
図１（ａ）に示すように、ブロックチェーンネットワークを構成する装置はインターネットに接続されて相互に通信可能であり、少なくとも、本実施形態に係る情報処理装置１と、その他のマイナーの所有・運営に係るマイナー装置５（５−１、５−２、５−３・・・）を含んでいる。
情報処理装置１、マイナー装置５は、夫々プルーフ・オブ・ワーク（Proof of Work、以下ＰｏＷと記載する）処理を行う。
【００１５】
図１（ｂ）に示すように、ブロックチェーンネットワークは、情報処理装置１、マイナー装置５によるＰ２Ｐネットワークとして構成されている。
Ｐ２Ｐのシステムは、中央集権的なクライアントサーバシステムとは異なる。ブロックチェーンネットワーク内で行われたトランザクション（仮想通貨を用いた取引）は、各ノード（情報処理装置１、マイナー装置５）に対して伝達、共有される。
ブロックチェーンは、各ノードで共有され、同じブロックチェーンのデータが各ノードで保持される。
図１（ｃ）に示すように、ブロックチェーンは、前ブロックのハッシュ値と現ブロックのデータ、Ｎｏｎｃｅによってなるブロックが互いに接続されて構成されている。
トランザクションデータを受信した各ノードでは、取引の承認を行うとともに、既存のブロックチェーンに対して新たなブロックを接続するための作業を行う。
【００１６】
この作業は、ブロックチェーンを構成する先頭ブロックのハッシュ値と、新たに発生したトランザクションの現ブロックのデータと、ランダムなＮｏｎｃｅ値と、を組み合わせたデータのハッシュ値が所定の条件を満たす（例えば、先頭のビットが所定数連続して０となる）Ｎｏｎｃｅ値を見いだすものである。
膨大な演算処理を必要とする作業であるため、プルーフ・オブ・ワークと呼ばれる。
仮想通貨のマイニングでは、その接続作業（すなわち、ブロックの承認作業）に対する報酬として、最初に正解のＮｏｎｃｅ値を発見したノード（マイナー）に対してその仮想通貨が支払われる。従って、このようなＰｏＷの作業はマイニング（仮想通貨の発掘）と呼ばれる。
【００１７】
図２は、本実施形態に係る情報処理装置の構成を説明するブロック図であり、（ａ）はハードウェア構成図、（ｂ）はソフトウェアによる機能ブロックを示す図である。
図２（ａ）に示すように、本実施形態に係る情報処理装置１は、情報処理装置を実現するたえの各種のプログラムを実行するＣＰＵ（Central Processing Unit）１０と、ＣＰＵ１０で実行されるプログラムが展開され、一時データやパラメータが保持されるＲＡＭ（Random Access Memory）１１と、ＧＰＵ（Graphic Processing Unit）を搭載し、マイニング処理を実行するグラフィックボード１２と、データを格納する記憶手段としてのＨＤＤ（Hard Disk Drive）１３と、図示しないＲＯＭ（Read Only Memory）と、情報処理装置１をネットワークに接続するためのネットワークＩ／Ｆ１４と、を備えている。
例えば、ＨＤＤ１３には、ブロックチェーンが格納されており、本実施形態の情報処理装置１で探索されたＮｏｎｃｅ値や、ネットワークＩ／Ｆ１４を介して取得した他のマイナー装置が探索したＮｏｎｃｅ値に基づいて新たなブロックが接続される。
ただし、これに限らず、ブロックチェーンは、ローカルのＨＤＤ１３に限らず、情報処理装置１からアクセス可能なネットワーク上のストレージやサーバに格納されていてもよい。
【００１８】
図２（ｂ）に示すように、ＣＰＵ１０は、ブロックデータ受信処理制御部２０、ハッシュ処理制御部２１、Ｎｏｎｃｅ受信処理制御部２２、Ｎｏｎｃｅ送信処理制御部２３を実行する。
ブロックデータ受信処理制御部２０は、ネットワークＩ／Ｆ１４を介して新たなブロックデータを受信すると、受信したブロックデータをＲＡＭ１１に格納する。
【００１９】
ハッシュ処理制御部２１は、グラフィックボード１２上のＧＰＵを制御して、受信したブロックデータに対するハッシュ処理を行わせる制御部である。
また、ハッシュ処理制御部２１は、ＨＤＤ１３に格納されているブロックチェーンにおける前ブロックと、受信されてＲＡＭ１１に格納されている新たなブロックデータと、Ｎｏｎｃｅ値と、を合わせた処理対象データをグラフィックボード１２に供給し、本実施形態の特徴である超並列ハッシュ処理を行わせる。
詳述するが、ＧＰＵが備える多数のＧＰＵコアを用いた超並列処理のために、Ｎｏｎｃｅ値のみを異ならせた多数の処理対象データを複数に供給する。
【００２０】
図２（ｃ）に示すように、ハッシュ処理制御部２１は、グラフィックボード１２が備えるＧＰＵによる処理のために、上記処理対象データを生成するとともに、それを分割してＧＰＵへの入力データを生成するデータ生成部２１ａと、後述する入力データに対するデータ再配置操作を行うデータ再配置処理部２１ｂと、ＧＰＵによって生成されたハッシュ値が所定の条件を満たすか否かを判定する判定処理部２１ｃと、条件を満たすハッシュ値を用いてブロックチェーンに対する新たなブロックの接続を行うブロック処理部２１ｄと、を含む。
【００２１】
Ｎｏｎｃｅ受信処理制御部２２は、ネットワークＩ／Ｆ１４を介して取得した他のマイナー装置が探索したＮｏｎｃｅ値を受信し、これに基づいて、ＨＤＤ１３に格納されるブロックチェーンに新たなブロックを接続する制御を行う。
Ｎｏｎｃｅ送信処理制御部２３は、ハッシュ処理制御部２１によって探索された条件を満たすＮｏｎｃｅ値を、ネットワークＩ／Ｆ１４を介して、ブロックチェーンネットワークにおける他の装置に送信する制御を行う。
【００２２】
なお、本実施形態においてＣＰＵ１０が実行する上記処理部（ブロックデータ受信処理制御部２０、ハッシュ処理制御部２１、Ｎｏｎｃｅ受信処理制御部２２、Ｎｏｎｃｅ送信処理制御部２３）の一部又は全部の処理は、ＧＰＵが備えるコアによって行われてもよく、特に、ハッシュ処理制御部２１に含まれるデータ生成部２１ａ、データ再配置処理部２１ｂ、判定処理部２１ｃ、ブロック処理部２１ｄの一部又は全部の処理は、ＧＰＵが備えるコアによって好適に行うことが出来る。
【００２３】
図３は、本実施形態の情報処理装置が備えるグラフィックボードの構成を示す図である。
図３に示すように、グラフィックボード１２は、演算処理手段としてのＧＰＵ３０と、データの記憶手段としてのＶＲＡＭ４０と、を備えている。
図示しないが、グラフィックボード１２は、他にもＰＣＩｅバス等の内部バスに接続してＣＰＵ１０やＲＡＭ１１と通信を行うための端子や、モニタ等に映像信号を出力するための出力端子等を備えている。
ただし、本実施形態の用いられるＧＰＵ３０は、グラフィック演算手段としてよりも、多数のコアを生かした並列処理が可能な汎用演算手段として用いられる。このようなＧＰＵを、ＧＰＧＰＵ（General Purpose GPU）という場合がある。
また、ＧＰＵ３０は、多数のコア３１と、１つのコア３１ごとに１つずつ設けられた所定ビットのレジスタ３２と、キャッシュメモリ、とを備えている。
コア３１は、ＤＲＡＭ（ＲＡＭ１１又はＶＲＡＭ４０）から、レジスタ３２に値を読み込み、演算を行い、レジスタに格納されている結果を、ＤＲＡＭ（ＲＡＭ１１又はＶＲＡＭ４０）に書き込む処理を行う。
【００２４】
ランダムアクセスメモリ（ＲＡＭ：Random Access Memory）であるＶＲＡＭ４０は、例えば、３２ビットを１ワードとして複数ワードのデータを管理することが出来る。
ワードとは、コンピュータ（ＣＰＵ）によって異なり、コンピュータが一度に処理可能な最大ビット数である。
３２ビットのＣＰＵであれば、１ワードは３２ビット（４バイト）、６４ビットのＣＰＵであれば１ワードは６４ビット（８バイト）である。
本実施形態ではデータの処理を、ＧＰＵコアによって行うため、ワードサイズは各コア３１で一度に処理可能なビット数である。
【００２５】
ＧＰＵ３０は、多数のコア３１を用いて、全てのコアで同じ命令を並列的に実行することが出来る。このような並列処理をＳＩＭＤ（Single Instruction Multiple Data）という。
ハッシュアルゴリズムとしてＳＨＡ−３を用いるイーサリアムなどのオルトコインのマイニングでは、処理を高速化するために、多数のコアを用いた並列計算（ＳＩＭＤ）がすでに行われている（ＧＰＵマイニング）。
ハッシュ関数に係る演算処理を超並列的（多数のコアを用いた並列演算＋各コア３１の演算におけるビットスライス実装による並列演算）に行うことで（超並列処理）、マイニングをより高速化することが可能となる。
【００２６】
上記したが、ブロックチェーン（仮想通貨）のマイニングは、前ブロックのハッシュ値及び新たなブロックデータ、Ｎｏｎｃｅ値を合わせたデータのハッシュ値が特定条件満たすＮｏｎｃｅ値を探す作業である。Ｎｏｎｃｅ値を替えながらハッシュ値を演算し、条件を満たす（正解となる）Ｎｏｎｃｅ値を探していくのである。
夫々Ｎｏｎｃｅ値を異ならせた複数の処理対象データを、同時並列的に処理することで、より早く、正解となるＮｏｎｃｅ値を探し出すことが出来る。
【００２７】
本実施形態の情報処理装置では、さらにＧＰＵ３０を構成するコア３１の一つひとつに対して「ビットスライス実装」を行うことで、ビットスライス実装によってＧＰＵコアが有するレジスタも効率的に利用して、ハッシュ演算プロセスを同時並列的に処理可能とし、処理速度を圧倒的に高めることが出来る。
なお、図３に示したグラフィックボードの構成はあくまで一例であり、これに限定されるものではない。可能であれば、情報処理装置の主基板に対して直接実装されるような（オンボード）で構成であってもよい。さらには、本実施形態の並列演算手法は、ＧＰＵに限らず、マルチコアのＣＰＵに対して適用することも可能である。
すなわち、ＣＰＵの各コアに対してビットスライス実装を行い、ＣＰＵの各コアが有するレジスタを効率的に利用してハッシュ演算プロセスを同時並列的に処理し、処理速度を高めることが出来る。
【００２８】
以下では、本実施形態の情報処理装置が適用するビットスライス実装について詳述する。
図４は、ビットスライス実装におけるデータ配置を例示する図である。
（ａ）は、通常実装でのデータ配置の特徴を示し、（ｂ）は、ビットスライス実装におけるデータ配置の特徴を示している。
ビットスライス実装は、ＳＷＡＲ（SIMD within A Register）などとも呼ばれるように、６４ビットなどワードサイズｗが長いプロセッサと、そのようなプロセッサの命令（スカラー命令）を、ビットを対象とした６４並列のＳＩＭＤ命令であるかのように扱う。
【００２９】
このようなビットスライス実装では、ビット単位の扱いが必要な処理を多数並列で行うことができ、ワードサイズｗが６４ビットのシステムの場合、ビットスライス実装では、６４ビット長のレジスタを用いて、６４ブロック分のデータを並列に処理することが出来る。もちろん、６４ビットに限らず、８ビットや１６ビット、３２ビットなどのレジスタによってもビットスライス実装が可能である。
【００３０】
図４には、レジスタサイズ（レジスタ幅）が８ビットの場合が示されている。
例として、８つの８ビットデータａ、ｂ、ｃ、ｄ、ｅ、ｆ、ｇ、ｈを処理する場合を考える。
図４（ａ）に示す通常実装の場合、８つのデータａ〜ｈは、経時とともに（時系列順で）順次処理が行われる。
［タイミングｔ１］
タイミングｔ１において、８ビットのレジスタに、データａが格納され、データａに対しワード単位で処理が行われる。
データａは、０ビット目ａ０、１ビット目ａ１、２ビット目ａ２、３ビット目ａ３、４ビット目ａ４、５ビット目ａ５、６ビット目ａ６、７ビット目ａ７からなり、夫々のビットのデータが、レジスタの１ビットに格納される。
【００３１】
［タイミングｔ２］
データａに対する処理後レジスタは解放され、次のタイミングｔ２において、レジスタにデータｂが格納され、データｂに対しワード単位で処理が行われる。
データｂは、０ビット目ｂ０、１ビット目ｂ１、２ビット目ｂ２、３ビット目ｂ３、４ビット目ｂ４、５ビット目ｂ５、６ビット目ｂ６、７ビット目ｂ７からなる。
［タイミングｔ３］
データｂに対する処理後レジスタは解放され、次のタイミングｔ３において、レジスタにデータｃが格納され、データｃに対してワード単位で処理が行われる。
データｃは、０ビット目ｂ０、１ビット目ｂ１、２ビット目ｂ２、３ビット目ｂ３、４ビット目ｂ４、５ビット目ｂ５、６ビット目ｂ６、７ビット目ｂ７からなる。
【００３２】
［タイミングｔ４］
データｃに対する処理後、次のタイミングｔ４において、レジスタ１にデータｄが格納され、データｄに対してワード単位で処理が行われる。
データｄは、０ビット目ｄ０、１ビット目ｄ１、２ビット目ｄ２、３ビット目ｄ３、４ビット目ｄ４、５ビット目ｄ５、６ビット目ｄ６、７ビット目ｄ７からなる。
［タイミングｔ５］
データｄに対する処理後レジスタは解放され、次のタイミングｔ５において、レジスタにデータｅが格納され、データｅに対してワード単位で処理が行われる。
データｅは、０ビット目ｅ０、１ビット目ｂ１、２ビット目ｂ２、３ビット目ｂ３、４ビット目ｂ４、５ビット目ｂ５、６ビット目ｂ６、７ビット目ｂ７からなる。
【００３３】
［タイミングｔ６］
データｅに対する処理後レジスタは解放され、次のタイミングｔ６において、レジスタにデータｆが格納されるデータｆに対してワード単位で処理が行われる。
データｆは、０ビット目ｂ０、１ビット目ｂ１、２ビット目ｂ２、３ビット目ｂ３、４ビット目ｂ４、５ビット目ｂ５、６ビット目ｂ６、７ビット目ｂ７からなる。
［タイミングｔ７］
データｆに対する処理後レジスタは解放され、次のタイミングｔ７において、レジスタにデータｇが格納され、データｇに対してワード単位で処理が行われる。
データｇは、０ビット目ｂ０、１ビット目ｂ１、２ビット目ｂ２、３ビット目ｂ３、４ビット目ｂ４、５ビット目ｂ５、６ビット目ｂ６、７ビット目ｂ７からなる。
【００３４】
［タイミングｔ８］
データｇに対する処理後レジスタは解放され、次のタイミングｔ８において、レジスタにデータｈが格納され、データｈに対してワード単位で処理が行われる。
データｈは、０ビット目ｈ０、１ビット目ｈ１、２ビット目ｈ２、３ビット目ｈ３、４ビット目ｈ４、５ビット目ｈ５、６ビット目ｈ６、７ビット目ｈ７からなる。
このように、通常実装であれば、複数のデータａ〜ｈは、時間ｔ毎にレジスタに格納されて順次処理される。
【００３５】
それに対して、図４（ｂ）に示すビットスライス実装の場合、８ビットのレジスタ（１〜８）が例えば８つ備えられている。
本実施形態において、例えば、レジスタ１〜８の０ビット目に、一連の時系列処理データａにおける０ビット目ａ０、１ビット目ａ１、２ビット目ａ２、３ビット目ａ３、４ビット目ａ４、５ビット目ａ５、６ビット目ａ６、７ビット目ａ７が格納される。
レジスタ１〜８の１ビット目には、一連の時系列処理データｂにおける０ビット目ｂ０、１ビット目ｂ１、２ビット目ｂ２、３ビット目ｂ３、４ビット目ｂ４、５ビット目ｂ５、６ビット目ｂ６、７ビット目ｂ７が格納される。
【００３６】
レジスタ１〜８の２ビット目には、一連のデータ時系列処理ｃにおける０ビット目ｃ０、１ビット目ｃ１、２ビット目ｃ２、３ビット目ｃ３、４ビット目ｃ４、５ビット目ｃ５、６ビット目ｃ６、７ビット目ｃ７が格納される。
そして、レジスタ１〜８の３ビット目に、一連のデータ時系列処理ｄにおける０ビット目ｄ０、１ビット目ｄ１、２ビット目ｄ２、３ビット目ｄ３、４ビット目ｄ４、５ビット目ｄ５、６ビット目ｄ６、７ビット目ｄ７が格納される。
【００３７】
そして、レジスタ１〜８の４ビット目に、一連の時系列処理データｅにおける０ビット目ｅ０、１ビット目ｅ１、２ビット目ｅ２、３ビット目ｅ３、４ビット目ｅ４、５ビット目ｅ５、６ビット目ｅ６、７ビット目ｅ７が格納される。
そして、レジスタ１〜８の５ビット目に、一連の時系列処理データｆにおける０ビット目ｆ０、１ビット目ｆ１、２ビット目ｆ２、３ビット目ｆ３、４ビット目ｆ４、５ビット目ｆ５、６ビット目ｆ６、７ビット目ｆ７が格納される。
【００３８】
そして、レジスタ１〜８の６ビット目に、一連の時系列処理データｇにおける０ビット目ｇ０、１ビット目ｇ１、２ビット目ｇ２、３ビット目ｇ３、４ビット目ｇ４、５ビット目ｇ５、６ビット目ｇ６、７ビット目ｇ７が格納される。
そして、レジスタ１〜８の７ビット目に、時系列処理一連のデータｈにおける０ビット目ｈ０、１ビット目ｈ１、２ビット目ｈ２、３ビット目ｈ３、４ビット目ｈ４、５ビット目ｈ５、６ビット目ｈ６、７ビット目ｈ７が格納される。
【００３９】
上記の例の場合、８つのレジスタに、８つの８ビットデータが分散して格納されることになる。
レジスタ１にはデータａ〜ｈの０ビット目が夫々格納され、レジスタ２にはデータａ〜ｈの１ビット目が夫々格納され、レジスタ３にはデータａ〜ｈの２ビット目が夫々格納され、レジスタ４にはデータａ〜ｈの３ビット目が夫々格納され、レジスタ５にはデータａ〜ｈの４ビット目が夫々格納され、レジスタ６にはデータａ〜ｈの５ビット目が夫々格納され、レジスタ７にはデータａ〜ｈの６ビット目が夫々格納され、レジスタ８にはデータａ〜ｈの７ビット目が夫々格納されている。
【００４０】
上記通常実装では、一つのデータが一つのレジスタに格納されており、複数のデータを順次レジスタに格納してワード単位でのデータ処理が行われる。
それに対し、ビットスライス実装では、（複数のレジスタを用意するとともに）複数のデータの向きを変換して、複数の（８つの）レジスタに跨がって、タイミングｔ１〜ｔ８で順次処理されるべき一連のデータを格納する。そして、各レジスタにおいて１ビットずつ複数のデータの並列処理が可能である。
データは、１ビットずつレジスタに格納されるため、通常実装とは異なり、ビット単位の処理である。そして、時系列で処理されるべきデータを並列で演算することが出来る。
通常実装におけるデータの扱いが、レジスタのビット方向に沿った横ベクトル的であるとみなした場合、ビットスライス実装では、レジスタを跨いだ縦ベクトル的な扱いであると言える。
そして、ビットスライス実装におけるデータの並びは、通常実装のデータ配置の置換行列に他ならない。
なお、ＤＲＡＭへのアクセス頻度があがり処理効率は損なわれることになるが、原理的には、１つのレジスタを用いてもビットスライス実装は可能である。
【００４１】
ビットスライス実装にはさらに以下のような利点がある。
例えば、１０ビットのデータを処理する場合、通常実装の場合には、レジスタ幅が１６ビットなら、６ビット分のデータ領域が無駄になるので、処理効率は１０／１６＝６２．５％となる。残りの６ビットで、別のビットデータを処理することは出来ないからである。
通常実装を用いて独立した複数のデータを処理する場合、データ数分の繰り返しの処理が必要となるが、このビットスライス実装によっては、レジスタのビット長（レジスタ幅）の分だけ並列処理を行うことができる。そして、図４（ｂ）に示すように、複数ビット長のデータを書き込む場合であっても、一つのレジスタについては１つのビットしか用いず、レジスタのビット長と同じ数の独立したデータ（プロセス）を同時に処理することが出来る。
つまり、レジスタの全ビットを１００％使うことができ、レジスタ単位での処理効率は１００％となる。
特に、ブロックチェイン（仮想通貨）のマイニングに適用したときに、ビットスライス実装は効果を発揮する。
マイニングでは特に処理スピードが求められるが、ほぼ同様のデータ（マイニングに用いるブロックデータや前ブロックハッシュ値、Ｎｏｎｃｅ値を含む処理対象データ）に対して、全く同じ処理を並列的に行う命令を行うのみであり、レジスタ（群）に対して複数の処理に係るデータを書き込んで、並列的に処理を進められることで処理速度の大幅な向上が期待出来る。
従って、ビットスライス実装は、ブロックチェイン（仮想通貨）のマイニングについて非常に好適な仕組みである。
【００４２】
また、ビットスライス実装を用いることでＧＰＵコア内部での処理対象データの超並列計算を実現することが出来るが、ビットスライス実装を用いる効果はそれのみに留まらない。
すなわち、ビットスライス処理によって、ハッシュ計算それ自体を一部簡略化あるいはスキップして処理付加を低減し、処理速度を向上することが出来る。
特に、後述するＳＨＡ−３によるハッシュ演算におけるブロック置換や、その他のハッシュ演算で必要な「ビット転置」の処理がゼロになる（スキップできる）。
ビットスライス実装では、レジスタ上のアドレスの読み替え（アドレッシング）で「ビット転置」を行うことができるので、実質の処理はゼロとなるのである。
それに対して、通常実装の場合、「ビットマスク」、「シフト演算」を組み合わせて上記「ビット転置」を処理する必要がある。そして、これらの処理にはＣＰＵの処理ステップを要する。
アドレッシングは、ＣＰＵやＧＰＵコアの命令ステップに含めずに実行可能であり、ビットスライス実装では、ハッシュ演算において必要な処理ステップ（演算量）を削減することが出来る。
【００４３】
一つのレジスタを用いて、複数のデータ列を交互に入れ替えながら処理を行う必要がある通常実装にあっては、このような処理が不可欠である。
例えば、ビット列Ｘの３ビット目とビット列Ｙの５ビット目の排他的論理和ＸＯＲをビット列Ｚの０ビット目に算出する場合、通常実装では、
（１）Ｘ＝Ｘ＞＞３・・・ＤＲＡＭ上の変数Ｘに、レジスタ上のビット列Ｘを３ビットシフトして代入。
（２）Ｙ＝Ｙ＞＞５・・・ＤＲＡＭ上の変数Ｙに、レジスタ上のビット列Ｙを５ビットシフトして代入
（３）Ｚ＝Ｘ  ＸＯＲ  Ｙ・・・ＤＲＡＭ上の変数Ｚに、変数Ｘの値と変数Ｙの値の排他的論理和を代入する
（４）Ｚ＝Ｚ  ＡＮＤ  （０００００００１）・・・排他的論理和の文字列の０ビット目を１にマスクし、他の０にマスクする（「ビットマスク」）
の４ステップが必要となる。
式（１）、式（２）における「＞＞」は、右シフト演算子である。なお、「＜＜」は左シフト演算子である。右シフトは連続したビットを右に、左シフトはビットを左にずらす。
【００４４】
それに対し、ビットスライス実装では、Ｘの０ビット目をＸ［０］、Ｘの１ビット目をＸ［１］というように、ビット列を配列に格納することになる。
従って、ビットスライス実装においては、上記と同様にビット列Ｘの３ビット目とビット列Ｙの５ビット目の排他的論理和ＸＯＲをビット列Ｚの０ビット目に算出する場合に「ビットマスク」も「シフト演算」も行う必要がない。
ビットスライス実装で必要なのは、アドレスの読み替えによる
（１）ビット列Ｚ［０］＝ビット列Ｘ［３］  ＸＯＲ  ビット列Ｙ［５］
の１ステップのみである。
このようなアドレッシングは処理ステップにカウントせずに実行することが出来る。
【００４５】
さらに、上記のように（８ビットレジスタを使って）８つの独立したデータに上記処理を行う場合、通常実装ではさらにデータ数分（８倍）の３２ステップが必要となる。
それに対して、ビットスライス（ＳＩＭＤ）実装では、例えば８ビット分の計算を同時に行うことができるため、必要なステップ数は１倍すなわち１ステップで済むのである。
上記した通常実装では、未だ高速化の余地が残されていたが、ビットスライス実装では、上記の理由から通常実装に比べて各段に高速に処理を行うことが出来る。
【００４６】
以上では、本実施形態の情報処理装置において、多数のＧＰＵコアの一つひとつに適用されるビットスライス実装について説明した。
以下では、本実施形態の情報処理装置においてビットスライス実装による並列ハッシュ処理がどのように行われるのか、そして、本実施形態の情報処理装置がブロックチェーンに係るハッシュ計算に適用されたときにどのように処理が効率化、高速化されるのかを、例を挙げて説明する。
なお、ここでは、イーサリアムなどのオルトコインで代表的に用いられるハッシュアルゴリズムであるＳＨＡ−３を適用する場合を説明する。
ただし、本実施形態の情報処理装置に適用可能なハッシュ関数は、このＳＨＡ−３に限らず、ビットコインで用いられるＳＨＡ−２なども好適に適用することが出来る。
適用されるハッシュアルゴリズムに係わらず、ハッシュ処理の対象となるデータを分割して夫々のデータの向きを変換し、複数の（８つの）レジスタに跨がって一連のデータを格納して処理することにより、１ビットずつ並列処理が可能である点では同じである。
本実施形態の処理装置は、多数のＧＰＵコア、及び各ＧＰＵコアに対するビットスライス実装によって、同様のデータに対する同じ命令を超並列処理できる点に主な特徴があり、特に、ハッシュ処理に好適に適用できる。
【００４７】
例として取り上げるＳＨＡ−３で用いられるＫｅｃｃａｋアルゴリズムは、入力フェーズとしてブロックデータを内部状態に吸収し、搾出フェーズとして、内部状態からハッシュ値（出力）を搾出する、スポンジ構造と称される仕組みを用いている。
「スポンジ構造」は、可変長の入力を受け取り、任意の長さの出力を得る関数を作る構造と言える。
その内部では固定長の変換（transformation）もしくは置換（permutation）が用いられる。
ＳＨＡ−３についての詳細は、FIPS 202, SHA-3 Standard:  Permutation-Based Hash and Extendable-Output Functions（http://dx.doi.org/10.6028/NIST.FIPS.202）として開示されている。
従って、仕様について詳細な説明は省略するが、本実施形態の装置を用いることで、処理の高速化を図り得る点について特に言及する。
【００４８】
［前処理］として、ＣＰＵ１０は、「処理対象データ」にパディング処理を施した後で分割する。すなわち、処理対象データを例えば１０８８ビットごとのブロックに分割する（データ長が１６００ビットの入力データを用いるＫｅｃｃａｋ―ｆ［１６００］の場合）。ブロックの個数は、ブロックデータのデータ長に応じて異なる。
本実施形態の場合、「処理対象データ」は、ブロックチェーンにおける前ブロックのハッシュ値、今回のブロックデータ、Ｎｏｎｃｅ値を合わせたデータである。
そして、特に本実施形態の場合、ＣＰＵ１０は、コア数×コア毎の並列処理可能数の「処理対象データ」を用意し、各「処理対象データ」を分割して１０８８ビットの分割データを得る（Ｋｅｃｃａｋ―ｆ［１６００］の場合）。
【００４９】
次に、ＣＰＵ１０は、「入力フェーズ」として、上記各「処理対象データ」の各分割データ（１０８８ビット）に対して［１］〜［３］の処理をそれぞれ実行する。
・処理［１］ＣＰＵ１０は、ブロック置換を行うための全単射関数ｆに対するインプットを生成する。
［前処理］で生成した各「処理対象データ」のブロック（１０８８ビット）と、１６００ビットの「状態（Ｓｔａｔｅ）」（ブロック置換の処理結果）の先頭１０８８ビットと、の排他的論理和ＸＯＲをとる。
排他的論理和は、コンピュータで用いられる論理演算の１つである。２入力の場合は、入力が「真」と「偽」の組み合わせならば出力は「真」となり、それ以外でれば出力は「偽」となる。２進数の場合、入力が「１」と「０」、もしくは「０」と「１」ならば出力は「１」となり、それ以外であれば出力は「０」となる。すなわち、２つの入力が一致していれば出力は「０」、一致していなければ出力は「１」となる。
「状態」は、ブロックについて［１］〜［３］の処理によるブロック置換の後の内部状態を示す情報である。
なお、最初のブロックについてブロック置換を行う場合、「状態」は全てのビットが「０」である。
【００５０】
・処理［２］ＣＰＵ１０は、全単射関数ｆのState Arrayを構築する
上記排他的論理和ＸＯＲの結果（１０８８ビット）に２５６（出力ハッシュ長）×２＝５１２ビットの「キャパシティ」を加えた１６００ビットのデータを関数ｆに対する入力データ（State Array）とする。
【００５１】
図５は、ＳＨＡ−３のState Arrayを示す図であり、入力ブロックのデータ長１６００ビットであるＫｅｃｃａｋ−ｆ［１６００］の場合の例を示している。
（ａ）は、５×５アレイ×６４（＝１６００）ビットの状態（Ｓｔａｔｅ）を示している。６４は、ワードサイズｗである。ただし、図ではｗ＝８であり、データ長は２００である。
（ｂ）〜（ｇ）はState Arrayのパーツを示している。
State Arrayの２次元サブアレイとして、（ｂ）は、（ｘ，ｚ）のplaneを示し、（ｃ）は、（ｘ、ｙ）のsliceを示し、（ｄ）は、（ｙ，ｚ）のsheetを示している。
State Arrayにおける１次元のサブアレイとして、（ｅ）は、（ｘ）のrowを示し、（ｆ）は、（ｙ）のcolumnを示し、（ｇ）は、（ｚ）のlaneを示している。
本実施形態の処理装置は、下記の処理［３］として、State Array（図５）全体に対するビット処理を、レジスタのビット数分並列的に実行することが出来る。
各State Arrayに対するビット処理においては、各アレイの２次元サブアレイが用いられるが、このような処理はあくまでもビット演算なので、処理［３］は、ビットスライスのビット単位の処理に容易に書き下すことが出来る。
【００５２】
・処理［３］関数ｆによって、State Arrayに対するブロック置換を反復（２４回）して行う
この反復計算には、Θ、ρ、π、χ、ιの５つの関数が定義されており、記載の順に、State Arrayに対して処理を施す。
【００５３】
本実施形態の装置において、上記複数の異なる処理対象データに係る各State Arrayは、下記に詳述するようにデータの向きを変換されて各複数のレジスタに跨がって格納され、各レジスタにおいて、複数のState Arrayに対する処理が１ビットずつ並列で行われる。
実装されるレジスタ数には限りがあるが、レジスタ数に応じてState Arrayを分割し、各State Arrayにおいて、分割したデータに対する処理（ブロック置換処理）が終了すると、処理結果をＲＡＭ１１やＶＲＡＭ４０に格納したうえで、次の分割したデータに対する処理を行うことで、長大なデータ長を持つState Arrayに対応することが出来る。
このような入力データ（State Array）に対する処理を繰り返すことで、処理対象データ（異なるＮｏｎｃｅ値を付したブロックデータ等）全体に対する処理を行うことができる。
【００５４】
「関数Θ」では、State Arrayにおける５×ｗ（ワードサイズｗ＝６４のとき３２０）ごとの５ビットのカラム（column）のパリティ（５ビットの排他的論理和）を計算し、さらに隣接する２つのカラムとの排他的論理和ＸＯＲを計算する。
・ステップ（１）
０≦ｘ＜５、０≦ｚ＜ｗ（ワードサイズ＝６４）を満たす全ての（ｘ，ｚ）について、
2019159183.tif 000003
を実行する。
【００５５】
・ステップ（２）
０≦ｘ＜５、０≦ｚ＜ｗ（ワードサイズ＝６４）を満たす全ての（ｘ，ｚ）について、
2019159183.tif 000004
を実行する。
・ステップ（３）
０≦ｘ＜５、０≦ｙ＜５、０≦ｚ＜ｗ（ワードサイズ、６４）を満たす全ての（ｘ，ｙ，ｚ）について、
2019159183.tif 000005
を実行する。
ここで、Ａは、関数Θを実行前の入力State Arrayを示し、Ａ’は、関数Θを実行後の出力State Arrayを示す。
【００５６】
Θ関数では、State Arrayの２つのカラムのパリティの状態における各ビットの排他的論理和（ＸＯＲ）をとる。
特に、入力となるState ArrayＡのビット［ｘ０，ｙ０，Ｚ０］について、２つのカラムのうちの一つのｘ座標は、同一ｚ座標について（ｘ０−１）ｍｏｄ５であり、その一方で、他のカラムのｘ座標は、ｚ座標（ｚ０−１）ｍｏｄ  ｗについて（ｘ０＋１）ｍｏｄ５である。
この関数Θにおけるカラムに対する（ｚ座標の扱うｚ方向の）「ビット転置」において、ビットスライス実装が効果を発揮する。「ビット転置」は、アドレッシングによって行うことができ、上記ステップ（２）に係るシフト演算をスキップすることが出来る。
【００５７】
「関数ρ」では、５×５＝２５ワードごとに異なる三角数０，１，３，６，１０，１５．．．でローテートを行う。
・ステップ（１）
０≦ｚ＜ｗ（ワードサイズ＝６４）を満たす全てのｚについて、
Ａ′［０，０，ｚ］＝Ａ［０，０，ｚ］
を行う。
・ステップ（２）
（ｘ，ｙ）＝（１，０）
【００５８】
・ステップ（３）
０≦ｚ＜ｗ（ワードサイズ＝６４）を満たす全てのｚについて、０から２３までのｔについて、
（ａ）  Ａ′［ｘ，ｙ，ｚ］＝Ａ［ｘ，ｙ，（ｚ−（ｔ＋１）（ｔ＋２）／２）ｍｏｄ  ｗ］
（ｂ）  （ｘ，ｙ）＝（ｙ，（２ｘ＋３ｙ）ｍｏｄ５）
を行う。
・ステップ（４）
Ａ’を返す処理を行う。なお、Ａは、関数ρを実行前の入力State Arrayを示し、Ａ’は、関数ρを実行後の出力State Arrayを示す。
この関数ρにおけるローテートにおいても、ビットスライス実装が効果を発揮する。
ステップ（３）（ａ）におけるｚ方向へのビットの移動（ローテート）に係る処理についても、アドレッシングにて行うことができ、シフト演算をスキップすることが出来る。
「関数χ」では、
2019159183.tif 000006
を用いてビット列を結合する。
「関数ι」では、ラウンド定数と状態ワードの排他的論理和を取る。
【００５９】
全ての「ブロック（分割データ）」に対して、上記処理［１］、処理［２］、処理［３］における入力フェーズの処理を行った後（最終ブロックに対するブロック置換の処理を行った後）、後処理（搾出フェーズ）として、State Arrayからｄビットのハッシュ値（出力ビット）を取り出す（「搾出」する）処理を行う。
ハッシュ値のビット長ｄの値は、ｄ＝｛２４４，２５６，３８４、５１２｝を取り得る。
夫々のハッシュ値のデータ長ごとにＳＨＡ３−２４４、ＳＡＨ３―２５６、ＳＨＡ３−３８４、ＳＨＡ３−５１２が定義されている。
【００６０】
次の「搾出フェーズ」において、ＣＰＵ１０は、ハッシュ値を「搾出」する処理は以下のように実行する。
すなわち、最終的に出力されている１６００ビットの「状態（Ｓｔａｔｅ）」のうち、先頭１０８８ビット（内部状態）が出力される。
その１０８８ビットにさらに５１２ビットのキャパシティを加えた１６００ビットのデータを上記関数に入力する。
その出力が次の内部状態となり、それをキャパシティ５１２ビットとともに上記関数に入力し、必要なビット＝ｄ（２５６）の出力が得られるまで繰り返す。
【００６１】
図６、図７は、本実施形態の情報処理装置においてビットスライス実装によるハッシュ計算を行うための処理を説明する図である。
また、図８は、本実施形態の情報処理装置におけるＲＡＭ（ＶＲＡＭ４０）上のデータ再配置を説明する図である。
特に入力データのデータ長が１６００ビットのＫＥＣＣＣＡＫ―ｆ［１６００］を用いる場合を例にとって、ビットスライス実装を行う本実施形態の情報処理装置においてハッシュ計算を行うための処理（データ操作）を説明する。
上記したＳＨＡ−３を例に取ったビットスライス実装によるハッシュ計算を行うための準備段階と言える処理である。
【００６２】
なお、上記したように、本実施形態の装置における処理対象データは、ブロックチェーンにおける現ブロックデータに前ブロックのハッシュデータを組み合わせたデータに、ランダムなＮｏｎｃｅ値を組み合わせたものである。
それぞれのコア３１による処理のために、Ｎｏｎｃｅ値を異ならせた複数の（例えば、並列処理が可能なレジスタ長分など）処理対象データがＤＲＡＭ（ＲＡＭ１１又はＶＲＡＭ４０）に格納される。
上記のように、この処理は、ネットワークＩ／Ｆ１４を介して受信された新規ブロックのデータについて、ＣＰＵ１０によって行われる。
【００６３】
一つのコア３１は、同じ内容（現ブロックデータ、前ブロックのハッシュ）を含むとともにＮｏｎｃｅ値を異ならせた複数の処理対象データをＤＲＡＭ（ＶＲＡＭ４０又はＲＡＭ１１）から取得する。
各コア３１に対するデータ入力は、ＣＰＵ１０によって制御される。
上記したように、ＧＰＵ３０が備える夫々のコア３１によって、同じ内容（現ブロックデータ、前ブロックのハッシュ）を含むとともにＮｏｎｃｅ値を異ならせた複数の処理対象データに対して、暗号的ハッシュ処理を同時並列的に行う。
さらに、各コア３１単位で、複数の処理対象データ（同じ現ブロックデータ、前ブロックのハッシュ及び異なるＮｏｎｃｅ値）に対してビットスライス実装を行い、１つのレジスタで複数の処理対象データに対して１ビットずつ処理を行う。
これにより、本実施形態の装置では超並列的な処理が可能である。
【００６４】
図６（ａ）に示すように、各コア３１による並列処理のために、Ｎｏｎｃｅ値を異ならせた複数の処理対象データがＤＲＡＭ（ＲＡＭ１１又はＶＲＡＭ４０）上に格納されている。図６（ａ）に示されているのは、１つのコアで並列処理をさせるためのＮｏｎｃｅ値が異なる３２個の処理対象データである。
処理対象データは、ＣＰＵ１０が、受信した新規ブロックデータに基づいて、前ブロックのハッシュ値やＮｏｎｃｅ値とともに生成したデータである。
ＣＰＵ１０は、コア数×各コアにおける並列処理可能数の基づく数だけ処理対象データを生成し、ＤＲＡＭに格納する。
入力データは、この処理対象データを特にＳＨＡ−３処理のために分割し、キャパシティと合わせたデータである。
この例では、各ＧＰＵコアは、３２ビットのレジスタを有し、ビットスライス処理によって３２個の「処理対象データ(に基づく入力データ)」を一度に並列に処理することが出来る。
本実施形態の処理装置が通常実装による処理を行う場合、これらの処理対象データは、時系列で順次処理を行っていたデータである（図４参照）。
処理対象データ（１）はタイミングｔ１で処理され、処理対象データ（２）はタイミングｔ２で処理され、処理対象データ（３）はタイミングｔ３で処理され、処理対象データ（３２）はタイミングｔ３２で処理される。
【００６５】
本実施形態の情報処理装置がＳＨＡ−３に適用される場合には、並列処理が行われる各処理対象データは１６００ビット（パディング済みの１０８８ビット＋キャパシティ５１２ビット）の入力データ（State Array）に分割されている。
上記したが、本実施形態の情報処理装置は、マイニング用のハッシュ関数としてＳＨＡ−３のみに適用可能ではなく、ＳＨＡ−２など他のハッシュ関数の並列処理にも当然適用可能である。
入力データは、本実施形態の情報処理装置が適用されるハッシュ関数（ハッシュアルゴリズム）によって異なる。
【００６６】
ＣＰＵ１０（データ生成手段）は、ＧＰＵによる処理のために、ＤＲＡＭ（ＲＡＭ１１又はＶＲＡＭ４０）に格納されている、レジスタのビット数（例えば３２ビット）分の処理対象データを読み出し、ＳＨＡ−３の場合、各処理対象データから、上記入力データ（State Array）を生成する。
そして、図６（ｂ）に示すように、生成した入力データの夫々について、データ長を所定単位数、例えばレジスタ数（例えば８）毎に分割した分割データ（例えばデータ長が８ビットで２００個）を生成する。
並列処理の対象となる、異なる処理対象データに基づく８ビットの分割データ（ビット列データ、以下単に分割データと記載する）が３２個得られることになる。
通常実装であれば、この分割データは時系列で処理されるデータであり、分割データ（１）はタイミングｔ１、分割データ（２）はタイミングｔ２、分割データ３２はタイミングｔ３２で処理される。それに対し、ビットスライス実装によって同時並列的に処理が行われる。
ここで、３２個の分割データ（８ビット）は、ａｘ１〜からａｘ３２とする。
これらのデータは、図８（ａ）の横軸に表される。
【００６７】
本実施形態の情報処理装置において、グラフィックボード１２がコア毎に３２ビットのレジスタを８個備えているものとして説明する。
ただし、これに限らず、６４ビットや１６ビット、８ビットのレジスタであっても同様の処理が可能である。ビットスライス処理の性質上、単純に、並列処理が可能なデータの数が減るのみであり、レジスタのビット数が多ければ多いほど、並列処理が可能なデータ数を増加させることが出来る。
本実施形態の記載における１コア当たりのレジスタサイズ、レジスタ数はあくまで一例であり、適宜変更することが可能な値である。もちろん、処理対象データや分割データのデータ長及びその個数も一例にすぎず、条件に応じて当然に変更される数値に過ぎない。
また、各コア３１が使用する入力データや、その他分割データは、コア３１が生成するようにしてもよい。
【００６８】
ＣＰＵ１０（データ生成手段）が生成する３２個の８ビットの分割データは、ａ［ｉ，ｊ］∈｛０，１｝，（ただし、１≦ｉ≦８；１≦ｊ≦３２）と表されるデータよりなる。
ビットデータは、０又は１の値をとり、値ｉは、そのビットデータが、ビット列データ内のどのビット数目（順番）を示し、値ｊは、そのビットデータが、何番目の分割データに属するかを示している。
【００６９】
図８（ａ）に示すように、例えば、本実施形態における３２個の８ビットの分割データのうち、１個目の分割データａｘ１は（ａ［８，１］｜｜．．．｜｜ａ［２，１］｜｜ａ［１，１］）で表される。「｜｜」は連接を表し、以下の説明においても同様である。
１個目の分割データａｘ１は、ａ［１，１］のビットデータ、ａ［１，２］のビットデータ、ａ［１，３］のビットデータ・・・ａ［１，８］のビットデータを含む。
ａ［１，１］の値は、そのビットデータが、１番目の分割データ（ビット列データ）の１番目のビットであることを示す。また、ａ［１６，１］の値は、そのビットデータが、１番目の分割データの１６番目のビットであることを示す。
【００７０】
また、２個目の分割データａｘ２は、（ａ［８，２］｜｜．．．｜｜ａ［２，２］｜｜ａ［１，２］）で表される。
また、３２個目の分割データａｘ３２は、（ａ［２５，３２］｜｜．．．｜｜ａ［２，３２］｜｜ａ［１，３２］）で表される。
分割データａｘ２において、ａ［１，２］の値は、そのビットデータが、２番目の分割データ（ビット列データ）の１番目のビットであることを示し、ａ［１６，２］の値は、そのビットデータが、２番目の分割データの１６番目のビットであることを示し、ａ［２５，２］の値は、そのビットデータが、２番目の分割データの２５番目のビットであることを示す。
あるいは分割データａｘ３２において、ａ［１，３２］の値は、そのビットデータが、３２番目の分割データの１番目のビットであることを示す。また、ａ［１６，３２］の値は、そのビットデータが、３２番目の分割データの１６番目のビットであることを示し、ａ［２５，３２］の値は、そのビットデータが３２番目の分割データの２５番目のビットであることを示す。
【００７１】
ＣＰＵ１０（データ再配置手段）は、図６（ｂ）の分割データを、手続き型演算ユニットによる、３２ビットを１ワードとしたビットスライス処理のために、図６（ｃ）に示すような８個の３２ビットのデータに変換し、図６（ｄ）に示すように、各変換後のデータをレジスタに格納する。
図６（ｄ）に示すように、通常実装ではタイミングｔ１〜ｔ３２で順次処理されるべき時系列データ（分割データ）が、レジスタのビット長方向に並列的に格納され、並列的に処理されることが分かる。
【００７２】
なお、上記では、各処理対象データを分割した上で、並び替えを行い、レジスタに格納して並列処理を行っているが、それに限定されることはない。
図６に示す３２個の処理対象データを分割することなく、図６（ｃ）に示すように、３２個の１６００ビットのデータのまま並び替えを行って、１６００個の３２ビットデータとした上で、レジスタに順次格納してもよい。
ＣＰＵ１０（データ再配置手段）は、ＤＲＡＭ（ＲＡＭ１１又はＶＲＡＭ４０）上の分割データａｘ１（ａ［ｘ，１］，（１≦ｘ≦８））〜分割データａｘ３２（ａ［ｘ，３２］，（１≦ｘ≦８））を再配置することで、データ長が３２ビットの８個の再配置後分割ビット列データａｙ１（ａ［１，ｙ］，（１≦ｙ≦３２））〜ａｙ８（ａ［８，ｙ］，（１≦ｙ≦３２））を生成する。
以下、再配置後分割ビット列データａｙ１〜ａｙ８は、単に再配置後分割データａｙ１〜ａｙ８と記載する。
レジスタに格納可能なデータ数は、当然、レジスタ数に制限されるため、例えば３２ビットのレジスタ数が８個であれば、３２ビットデータを８個ずつレジスタに格納し、処理が終了するごとに入れ替えて処理を行う。
【００７３】
３２ビット長のデータを８個、８のレジスタに格納しているが、ハッシュ計算における相互演算はワード（ここでは３２ビット）単位で行われ、８ビット長のデータを３２個、８個のレジスタを跨いで格納していることに実質的に変わりがない。
例えば、ＳＨＡ−３に適用される場合、State Arrayの１６００ビットに対する上記したブロック置換を行うのが、本実施形態のハッシュ計算である。１６００ビット単位の処理を、レジスタのビット数分同時並列的に行うことが出来る。
【００７４】
再配置後分割データａｙ１〜ａｙ８は、図８（ａ）の縦軸に表される。
そのとき、１個目の再配置後分割データａｙ１は、（ａ［１，３２］｜｜．．．｜｜ａ［１，２］｜｜ａ［１，１］）、２個目の再配置後分割データａｙ２は、（ａ［２，３２］．．．｜｜ａ［２，２］｜｜ａ［２，１］）となる。
７個目の再配置後分割データａｙ７は、（ａ［７，３２］｜｜．．．｜｜ａ［７，２］｜｜ａ［７，１］）、８個目の再配置後分割データａｙ８は、（ａ［８，３２］｜｜．．．｜｜ａ［８，２］｜｜ａ［８，１］）となる。
【００７５】
そして、ＣＰＵ１０（データ再配置手段）は、３２ビット長となった再配置後分割データａｙ１〜ａｙ８をレジスタ１〜８に格納する。
データ再配置手段の機能は、ＧＰＵコア３１によって実現されてもよい。
【００７６】
ＧＰＵコア３１（手続き型演算ユニット）は、３２ビットを１ワードとした所定の演算処理（ハッシュ演算処理）を実際に実行する。
ＧＰＵコア３１（手続き型演算ユニット）は、８個の再配置後分割データａｙ１〜ａｙ８を「ワード単位」で相互に演算する（上記（３）のブロック置換を繰り返し行う）。
手続き型演算ユニットは、処理が終わる毎に順次入れ替えて、１６００ビットの時系列データに対して、すべて再配置を行って演算を実行する。
予め１６００ビットの入力データを８ビットずつ分けず、並び替えた１６００個の３２ビットデータを順次レジスタに入力して並列処理を行うようにしてもよい。
【００７７】
図７（ａ）に示すように、全ての処理対象データに係る再配置後出力データについて処理が終了すると（ＳＳＨＡ−３の場合、搾出フェーズまで終了）ＤＲＡＭ上には、例えば、２５６個の３２ビットの出力ビット列データｂｙ１〜ｂｙ２５６が生成・出力される。
以下、出力ビット列データｂｙ１〜ｂｙ２５６は、単に出力データｂｙ１〜ｂｙ２５６と記載する。
本実施形態の場合、キャパシティを５１２ビット（ハッシュ長＝２５６×２）としており、ワード単位の相互演算の結果、夫々の入力データについて最終的にスポンジ関数から出力される値は、望みの２５６ビットのハッシュ値である。
本実施形態の装置がＳＨＡ−３以外に適用される場合でも、各入力データに対する並列処理の結果、所望のデータ長のハッシュ値が、レジスタのビット数分得られる。
ただし、この段階での出力は、入力時のデータ再配置を反映して２５６個の３２ビットデータとなっている。
【００７８】
出力データｂｙ１〜ｂｙ２５６は、図８（ｂ）の縦軸に表される。
２５６個の３２ビットの出力データｂｙ１〜ｂｙ２５６は、ｂ［ｉ−ｊ］∈｛０，１｝，（ただし、１≦ｉ≦２５６；１≦ｊ≦３２）で表されるビット列データよりなる。
図８（ａ）に示すように、例えば、本実施形態における２５６個の３２ビット出力データのうち、１個目の出力データｂｙ１は、（ｂ［１，３２］｜｜．．．｜｜ｂ［１，２］｜｜ｂ［１，１］）で表される。
１個目の出力データｂｙ１は、ｂ［１，１］のビットデータ、ｂ［１，２］のビットデータ、ｂ［１，３］のビットデータ・・・ｂ［１，３２］のビットデータを含む。
ａ［１，１］の値は、そのビットデータが、１番目の出力データの１番目のビットであることを示す。また、ａ［１，１６］の値は、そのビットデータが、１番目の出力データの１６番目のビットであることを示す。また、ａ［１，３２］の値は、そのビットデータが、１番目の出力データの３２番目のビットであることを示す。
【００７９】
また、２個目の出力データｂｙ２は、（ａ［２，３２］｜｜．．．｜｜ａ［２，２］｜｜ａ［２，１］）で表される。
出力データｂｙ２において、ａ［１，２］の値は、そのビットデータが、２番目のデータの１番目のビットであることを示し、ａ［１６，２］の値は、そのビットデータが、２番目のデータの１６番目のビットであることを示し、ａ［２５，２］の値は、そのビットデータが、２番目のデータの２５番目のビットであることを示す。
また、２５６個目の出力データｂｙ２５６は、（ａ［２５６，３２］｜｜．．．｜｜ａ［２５６，２］｜｜ａ［２５６，１］）で表される。
出力データｂｙ２５６において、ａ［２５６，１］の値は、そのビットデータが、２５６番目のデータの１番目のビットであることを示す。また、ａ［２５６，１６］の値は、そのビットデータが、２５６番目のデータの１６番目のビットであることを示し、ａ［２５６，３２］の値は、そのビットデータが２５６番目のデータの３２番目のビットであることを示す。
【００８０】
ここで、ＣＰＵ１０（判定処理手段）は、２５６個の３２ビットの出力データに基づいて、所定の条件を満たすハッシュ値が得られたか否かを判定する。
なお、本来、ハッシュ値を表しているのは、２５６個の３２ビットの出力データではなく、それらのデータを再配置した２５６ビットの値である。
【００８１】
そこで、ＣＰＵ１０（判定処理手段）による判定に際し、図７（ｂ）に示すように、ＣＰＵ１０（データ再配置手段）は、出力データｂｙ１〜ｂｙ２５６に対して、さらに再配置を行うことにより一連のデータとしてのハッシュ値を得る。
すなわち、ＣＰＵ１０（データ再配置手段）は、ＤＲＡＭ（ＲＡＭ１１又はＶＲＡＭ４０）に格納されている出力データｂｙ１〜ｂｙ２５６に含まれるデータを再配置し、３２個の２５６ビットの再配置後出力ビット列データｂｘ１〜ｂｘ３２をＤＲＡＭ上に生成する。
以下、再配置後出力ビット列データｂｘ１〜ｂｘ３２は、単に再配置後出力データｂｘ１〜ｂｘ３２と記載する。
再配置後出力データｂｘ１〜ｂｘ３２は、図８（ｂ）の縦軸に表される。
３２個の２５６ビットの再配置後出力データｂｘ１〜ｂｘ３２は、ｂ［ｉ，ｊ］∈｛０，１｝，（ただし、１≦ｉ≦２５６；１≦ｊ≦３２）で表されるビットデータよりなる。
１個目の再配置後出力データｂｘ１は、（ｂ［２５６，１］｜｜ｂ［２５５，１］｜｜．．．｜｜ｂ［２，１］｜｜ｂ［１，１］）で表され、２個目の再配置後出力データｂｘ２は、（ｂ［２５６，２］｜｜ｂ［２５５，２］｜｜．．．｜｜ｂ［２，２］）、ｂ［１，２］で表される。また、３２個目の再配置後出力データｂｘ３２は、（ｂ［２５６，３２］｜｜ｂ［２５５，３２］｜｜．．．｜｜ｂ［２，３２］｜｜ｂ［１，３２］）で表される。
【００８２】
ＣＰＵ１０（判定処理手段）は、このようにして生成された３２個の再配置後出力データ（ハッシュ値）ｂｘ１〜ｂｙ３２が、所定の特徴を満たすか否かを判定する。
すなわち、再配置後出力データｂｘ１〜ｂｙ３２の何れかの先頭所定ビット（例えば１７ビット）が連続して０となっているかを判定する。
より詳しくは、ＣＰＵ１０（判定処理手段）は、３２個の２５６ビットの再配置後出力データｂｘ１〜ｂｘ３２の夫々において、２５６ビット（ｂ［２５６，ｊ］｜｜．．．｜｜ｂ［２，ｊ］｜｜ｂ［１，ｊ］），（１≦ｊ≦３２））の上位ｔビット（例えば、ｔ＝１７）が全てゼロ（ｂ［ｉ，ｊ］＝０，（２５６−ｔ＋１≦ｉ≦２５６；１≦ｊ≦３２））であるか否かを判定する
条件を満たす再配置後出力データがあれば、その再配置後出力データに係る処理対象データに含まれるＮｏｎｃｅ値が正解のＮｏｎｃｅ値となる。
【００８３】
なお、ＣＰＵ１０（判定処理手段）は、出力データｂｙ１〜ｂｙ２５６の再配置を行うことなく、２５６個の３２ビットの出力データｂｙ１〜ｂｙ２５６に基づいて、所定の条件を満たすハッシュ値が得られたか否かを判定することが出来る。
実際に、出力データｂｙ１〜ｂｙ２５６について先頭ビットから０が所定数連続して続く部分を含むビット列データ（図８（ｂ）で横方向）を探しても良い。
この場合、ＣＰＵ１０（判定処理手段）は、２５６個の３２ビットの出力データに対し、２５６ビット（ｂ［２５６，ｉ］｜｜．．．｜｜ｂ［２，ｉ］｜｜ｂ［１，ｉ］），（１≦ｉ≦３２）のビット列データの上位ｔビット（例えばｔ＝１７）が全てゼロｂ［ｉ，ｊ］＝０，（２５６−ｔ＋１≦ｉ≦２５６；１≦ｊ≦３２）であるか否かを判定することで条件を満たすハッシュ値が得られたか否かを判定することが出来る。
【００８４】
しかし、この方法以外に、論理的ＯＲを用いた方法が好適に利用出来る。
すべての値が０の場合の論理和（論理的ＯＲ）は０であるが、１が一つでも含まれる場合、結果は１となってしまう。この性質を利用できる。
ＣＰＵ１０（判定処理手段）は２５６個の３２ビットの出力データｂｙ１〜ｂｙ２５６を構成する同ビット目同士で、個数（２５６個）方向の連続ビット（ｂ［２５６，ｉ］｜｜．．．｜｜ｂ［２，ｉ］｜｜ｂ［１，ｉ］），（１≦ｉ≦３２））間のデータ相関を判定することで、条件を満たすハッシュ値が得られたか否かを判定することが出来る。
【００８５】
より詳しくは、例えば０が１７個連続するハッシュ値を探す場合、ＣＰＵ１０（判定処理手段）は、２５６個の３２ビットの出力データｂｙ１〜ｂｙ２５６のうち、ｂｙ２４０からｂｙ２５６までの１７の出力データを取り出す。
そして、ＣＰＵ１０（判定処理手段）は、出力データｂｙ２４０〜ｂｙ２５６を構成する同ビット目同士（１ビット目同士、２ビット目同士、３ビット目同士・・・）で、個数（１７個）方向の連続ビットの論理和をとる。
例えば、図８（ｂ）の横方向における、ｂ［２４０，１］からｂ［２５６，１］までの１７個の値の論理和、ｂ［２４０，２］からｂ［２５６，２］までの１７個の値の論理和、ｂ［２４０，３］からｂ［２５６，３］まで１７個の値の論理和等を演算する。
このような演算は、図７（ａ）に示す状態の２５６個の出力データのうち１７個（ｂｙ２４０からｂｙ２５６）を夫々レジスタに配置し、レジスタの各ビットにおいて１７個のデータの論理和をとる演算に相当する。
【００８６】
演算の結果、論理的ＯＲが「０」となる（出力データｂｙ２４０〜ｂｙ２５６の）ビット目（ｂ［２４０，ｉ］〜ｂ［２５６，ｉ］）がある場合（レジスタ上に「０」のビットがある場合）、条件を満たす出力データが得られたことがわかる。
そのビット目に対応したビット列データ（ｂ［２５６，ｉ］｜｜．．．｜｜ｂ［２，ｉ］｜｜ｂ［１，ｉ］）が再配置されることで、条件を満たす正解となるハッシュ値（再配置後出力データ）が得られることになる。
このように、出力データｂｙ１〜ｂｙ２５６の再配置を行って実際のハッシュ値（２５６ビット）のかたちに直さずとも、再配置前のデータの特徴から、所望のハッシュ値を得られたか否かを判定することが可能である。
【００８７】
なお、論理和を使った方法は、再配置後出力データｂｘ１〜ｂｘ３２に対しても利用可能である。
ＣＰＵ１０（判定処理手段）は、３２個の２５６ビットの再配置後出力データｂｘ１〜ｂｘ３２に対し、２５６ビット（ｂ［２５６，ｊ］｜｜．．．｜｜ｂ［２，ｊ］｜｜ｂ［１，ｊ］），（１≦ｊ≦ｎ）間のデータ相関を判定する。
より詳しくは、０が１７個連続するハッシュ値を探す場合、ＣＰＵ１０（判定処理手段）は、２５６ビットの再配置後出力データｂｘ１〜ｂｘ３２の例えば上位１７ビットの値を取り出して、これらの論理和をとったときに演算結果が０であれば、その再配置後出力データは、条件を満たすハッシュ値を示すことになる。
【００８８】
図９は、イーサリアムにおけるＳＨＡ−３処理の実装コードを示す図である。
図９において、（ａ）に示すコードは、上記したＳＨＡ−３の仕様をＣ＋＋によって記述したものである。
上記処理［３］における２４回の反復処理において、関数ρによるローテーション処理が存在することがわかる。
また、図６において、（ｂ）に示すコードは、上記したＳＨＡ−３の仕様をｇｏによって記述したものである。
アセンブリコードのループの中に、ローテーション処理が存在することがわかる。
【００８９】
上記したように、Ｚ軸方向に移動するビット処理は、通常実装ではシフト演算を必要とする。
しかし、ビットスライス実装によっては、この処理をスキップすることが出来る。
（１）代入やインデックスはカウントしない（コンパイラ次第で０となる）
（２）論理演算は１とカウント
（３）Ｚに対するローテーションは３とカウント
（４）Ｋｅｃｃａｋ−ｆ［１６００］を想定し、（通常実装では）Ｚ軸方向の値を６４ビットレジスタ（ワードサイズが６４）にいれる、と想定する
【００９０】
この場合、通常実装の場合、合計のステップ数は、
Θ：４×５＋４×５＋１×５×５＝６５ステップ
ρ：２４（ラウンド）×３（ローテーション）＝７２ステップ
π：０ステップ
χ：３×５×５＝７５ステップ
ι：１ステップ
合計：２１３ステップ
となる。
【００９１】
一方、ビットスライス実装の場合、合計のステップ数は、
Θ：４×５＋１×５＋１×５×５＝５０ステップ（上記したΘのステップ（２）でビット演算をスキップできた分、通常実装に比べてステップ数を減らせている）
ρ：０ステップ（ビットスライス実装ではシフト演算を必要とせず、アドレッシングに変わるため処理ステップは０である）
π：０ステップ
χ：３×５×５＝７５ステップ
ι：１ステップ
合計：１２６ステップ
となる。
すなわち、オルトコインのハッシュアルゴリズムであるＳＨＡ−３に対してビットスライス実装を行うことによって、通常実装に比べ、２１３／１２６＝約１．７倍の効率化を実現することが出来た。
プロセッサによる処理の効率化は、すなわち、同じ構成のプロセッサによる処理の高速化を意味するため、ビットスライス実装を採用することにより通常実装に比べて処理を高速化することが出来る。
【００９２】
ＳＨＡ−３の全単射関数ｆは、１６００ビットのState Arrayの状態遷移を２４回反復処理すると定義されており、ビットスライス実装のためのビット再配置の処理を加えても、十分なパフォーマンスが得られると考えられる。
ビットスライス実装は、大量のデータをバルク処理するための手法であり、一般の暗号処理に適用する機会は極めて限定されるが、同じ処理を同時並列的に行うマイニングに対しては有効な方法である。
マイニング処理のグラフィックボードを利用した並列化（多数のコアによる並列演算）に加え、コア単位ではビットスライス実装を組み合わせることによって超並列計算処理が可能になる。
【００９３】
図１０は、本実施形態の情報処理装置のＣＰＵが実行する処理の一例を説明するフローチャートである。
下記の説明において、各コア３１の並列処理可能数や入力データのビット長、レジスタ数などの数値は全て一例に過ぎない。
ステップＳ１０１において、ＣＰＵ１０は、新たなブロックデータをブロックチェーンネットワークから受信したか否かを判定する。
受信したと判定した場合（ステップＳ１０１でＹｅｓ）、ＣＰＵ１０は、ステップＳ１０２において、新たなブロックデータをＤＲＡＭ（ＲＡＭ１１又はＶＲＡＭ４０）に格納する。
ＣＰＵ１０は、ステップ１０３において、ＧＰＵのコア数分×各コア３１の並列処理可能数（例えば３２）、Ｎｏｎｃｅ値を異ならせた処理対象データ（ブロックデータ、前ブロックのハッシュ、Ｎｏｎｃｅ値）を作成する。
ステップＳ１０４において、ＣＰＵ１０は、各コア３１のための複数（例えば３２）の処理対象データを、夫々所定のビット長（例えば、１０８８ビット）毎に分割する。
【００９４】
ステップＳ１０５において、ＣＰＵ１０は、各コア３１のための複数（例えば３２）の処理対象データについて、分割したデータにキャパシティを付与した入力データ（例えば、１６００ビット）を生成する。
ステップＳ１０６において、ＣＰＵ１０は、各コア３１のための複数（例えば３２）の処理対象データについて、各入力データ（１６００ビット）を、レジスタ数（例えば８個）ごとに分割して（この場合、８ビットのデータが２００個に分割）、ＤＲＡＭ（ＲＡＭ１１又はＶＲＡＭ４０）に展開する。
ステップＳ１０７において、ＣＰＵ１０は、各コア３１のための複数（例えば３２）の処理対象データについて、入力データの再配置をして８個の３２ビットデータをＤＲＡＭ（ＲＡＭ１１又はＶＲＡＭ４０）に展開する。
１６００ビットの入力データに基づく全ての８ビット分割データ、全ての処理対象データについて、分割データ（８ビット）の再配置をして８個の３２ビットデータをＤＲＡＭ（ＲＡＭ１１又はＶＲＡＭ４０）に展開する。
ステップＳ１０８において、ＣＰＵ１０は、各コア３１のための複数（例えば３２個）の処理対象データについて、ワード単位（３２ビット）で処理してブロック置換を行うように各コア３１に命令を行う（ＳＩＭＤ命令）。
【００９５】
ステップＳ１０９において、ＣＰＵ１０は、各コア３１のための複数（例えば３２個）の処理対象データについて、ブロック置換の結果得られた２５６個の３２ビットのデータをＤＲＡＭ（ＲＡＭ１１又はＶＲＡＭ４０）から読み込み、データの再配置をして、３２個の２５６ビットのデータをＤＲＡＭ（ＲＡＭ１１又はＶＲＡＭ４０）に展開する。
ステップＳ１１０において、ＣＰＵ１０は、ＤＲＡＭ（ＲＡＭ１１又はＶＲＡＭ４０）に展開された２５６個の３２ビットデータ（再配置前）、３２個の２５６ビットデータ（再配置後）が所定の条件を満たすか否かを判定する。
条件を満たすと判定した場合（ステップＳ１１０でＹｅｓ）、ＣＰＵ１０は、ネットワークＩ／Ｆ１４を介して、当該判定に係る処理対象データに含まれるＮｏｎｃｅ値をブロックチェーンネットワークに送信する制御を行う。
条件を満たさないと判定した場合（ステップＳ１１０でＮｏ）、ＣＰＵ１０は、ステップＳ１０３に戻り、ＧＰＵのコア数分、Ｎｏｎｃｅ値を異ならせた処理対象データ（ブロックデータ、前ブロックのハッシュ、Ｎｏｎｃｅ値）をさらに作成し、ステップＳ１０４からＳ１１１の処理を繰り返し行う。
【００９６】
以上のように構成したので、多数のコアを有するＧＰＵによる。多数のコアを用いた
ブロックデータに対するハッシュ処理の並列計算に加え、各コア３１における処理においてもビットスライス実装によって並列化を行った結果、処理ステップを減らし、処理速度を向上させることが出来る。
コア同士での並列処理は、ブロックチェーンのデータ処理に特有なＮｏｎｃｅ値の値だけが異なるほぼ同じデータに対する同じ処理内容（同じハッシュ関数を用いたハッシュ処理）である。
このような処理は、多数のコアによる比較的単純な並列演算を得意とするＧＰＵには相性がよい処理である。
それに加え、コア単位の（コア内での）処理でも同様に、ブロックチェーンのデータ処理に特有なＮｏｎｃｅ値の値だけが異なるほぼ同じデータを並列処理する。
このように、本実施形態の装置では、処理の効率化、高速化を図ることで、超高速なハッシュ処理が実現でき、従来に比しても圧倒的に多くのＮｏｎｃｅの検証を行うことができるため、非常に有利な条件でマイニングを行うことが可能となる。
【００９７】
上記したが、本実施形態の情報処理装置において、レジスタのビット長、それに対応した処理対象データ（分割データ）の数、分割データを再配置した再配置後分割データのビット長、及び出力データのビット長を示す値（ｎ＝３２）、レジスタの個数、それに対応した分割データのデータ長、分割データを再配置した再配置後分割データの個数を示す値（ｍ＝８）は、これらの値に限定されるものではない。
レジスタの数やビット長に合わせて適宜変更される値である。
また、出力データの個数及び再配置後出力データのデータ長を示す値（ｓ＝２５６）も、この値に限定されるものではなく、所望のハッシュ値のデータ長に合わせて適宜変更される値である。
【符号の説明】
【００９８】
１  情報処理装置、５  マイナー装置、１０  ＣＰＵ、１１  ＲＡＭ、１２  グラフィックボード、１３  ＨＤＤ、１４  ネットワークＩ／Ｆ、２０  ブロックデータ受信処理制御部、２１  ハッシュ処理制御部、２１ａ  データ生成部、２１ｂ  データ再配置処理部、２１ｃ  判定処理部、２１ｄ  ブロック処理部、２２  Ｎｏｎｃｅ受信処理制御部、２３  Ｎｏｎｃｅ送信処理制御部、３０  ＧＰＵ、３１  ＧＰＵコア、３２  レジスタ、４０  ＶＲＡＭ
【図１】
2019159183.tif 000007
【図２】
2019159183.tif 000008
【図３】
2019159183.tif 000009
【図４】
2019159183.tif 000010
【図５】
2019159183.tif 000011
【図６】
2019159183.tif 000012
【図７】
2019159183.tif 000013
【図８】
2019159183.tif 000014
【図９】
2019159183.tif 000015
【図１０】
2019159183.tif 000016