JP5896756B2 - 演算装置及びプログラム - Google Patents
演算装置及びプログラム Download PDFInfo
- Publication number
- JP5896756B2 JP5896756B2 JP2012009898A JP2012009898A JP5896756B2 JP 5896756 B2 JP5896756 B2 JP 5896756B2 JP 2012009898 A JP2012009898 A JP 2012009898A JP 2012009898 A JP2012009898 A JP 2012009898A JP 5896756 B2 JP5896756 B2 JP 5896756B2
- Authority
- JP
- Japan
- Prior art keywords
- value
- variable
- word
- thread
- divided
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000004364 calculation method Methods 0.000 claims description 256
- 238000000034 method Methods 0.000 claims description 171
- 238000012545 processing Methods 0.000 claims description 144
- 230000008569 process Effects 0.000 claims description 141
- 230000009467 reduction Effects 0.000 claims description 23
- 238000010586 diagram Methods 0.000 description 9
- FFBHFFJDDLITSX-UHFFFAOYSA-N benzyl N-[2-hydroxy-4-(3-oxomorpholin-4-yl)phenyl]carbamate Chemical compound OC1=C(NC(=O)OCC2=CC=CC=C2)C=CC(=C1)N1CCOCC1=O FFBHFFJDDLITSX-UHFFFAOYSA-N 0.000 description 6
- 230000008859 change Effects 0.000 description 6
- 230000015556 catabolic process Effects 0.000 description 5
- 230000000694 effects Effects 0.000 description 5
- 230000006870 function Effects 0.000 description 5
- 238000004590 computer program Methods 0.000 description 4
- 238000011946 reduction process Methods 0.000 description 2
- 230000011218 segmentation Effects 0.000 description 2
- 230000009466 transformation Effects 0.000 description 2
Images
Description
特に、RSA(登録商標)暗号や楕円曲線暗号などに用いられる多倍長整数の加算、減算、乗算、モンゴメリ・リダクション、モンゴメリ乗算を行う演算装置及びプログラムに関する。
このとき、一般的なCPU(Central Processing Unit)で演算可能なデータ長(例えば32ビット)を超えた数に対して、演算を行う必要がある。
中でも、多倍長乗算は、CPUの内部演算幅をb(bit)、入力長をl(bit)とした場合、n=l/bに対して、O(n2)の計算量がかかり、多倍長演算の中でも、重い処理の1つとなっている。
また、多倍長乗算とモンゴメリ・リダクションはペアで行うことが多く、これらをあわせてモンゴメリ乗算と呼ぶ。
通常、モンゴメリ・リダクションもO(n2)の計算量がかかる。
公開鍵暗号を高速化するにあたり、これらの処理の高速化が求められる。
しかしながら、特許文献1及び特許文献3の方式を実現するためには、専用装置が必要となる。
しかしながら、当該方式の場合、法pによる多倍長剰余算を行う必要があり、剰余演算に計算コストがかかる。
しかしながら、当該方式では、基底拡張に計算コストがかかる上に、整数による剰余算を行う必要がある。
他の演算に対して、剰余算が遅いプロセッサでは、かえって計算コストがかかる。
制御部と演算部と記憶部とを有し、入力値の加算を行う演算装置であって、
前記制御部は、
それぞれのビット幅が共通しており、それぞれのビット幅が前記演算部の演算ビット幅よりも大きい入力値X及び入力値Yを、それぞれ、前記演算部の演算ビット幅ごとに分割し、
前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割されたn(n≧2)個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを設け、
入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納し、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納し、
前記記憶部内の所定の記憶領域を割当てて、前記演算部による加算結果を格納するためのu(u>n)個の変数Z[0]〜Z[u−1]を設け、
前記演算部は、
スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、第1フェーズの処理として、
入力値Xのt番目の変数X[t]の値と、入力値Yのt番目の変数Y[t]の値とを用いて、(X[t]の値)+(Y[t]の値)を計算し、加算結果とキャリー値cを求め、加算結果をt番目の変数Z[t]に格納する処理を行い、
前記制御部は、
カウンタ値iを1に設定し、前記演算部に第2フェーズの処理を開始させ、
カウンタ値iがnに達するか、全てのスレッドtが第2フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
前記演算部は、
前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第2フェーズの1ラウンド分の処理として、
〈a〉(t+i)番目の変数Z[t+i]の値とスレッドtで得られたキャリー値cとを用いて、(Z[t+i]の値)+cを計算し、新たな加算結果と新たなキャリー値cを求め、
〈b〉変数Z[t+i]の値と新たな加算結果とを比較し、両者が一致している場合に、スレッドtの第2フェーズの処理を停止し、両者が一致しない場合に、新たな加算結果を(t+i)番目の変数Z[t+i]に格納する
処理を、行うことを特徴とする。
通常、数回のラウンド処理でキャリー値の処理は終了するため、全てのスレッドtにおいて早期に第2フェーズの処理が終了し、加算処理を高速に行うことができる。
このように、本発明によれば、専用装置を用いることなく、多倍長演算を少ない計算コストで高速に実現することができる。
実施の形態1〜5では、一例として、SIMD(Single Instruction Multiple Data)計算機を用いた多倍長演算装置を説明する。
また、実施の形態1〜5に係る多倍長演算装置は、一般的に入手可能なGPU(Graphics Processing Unit)を用いて実現することも可能である。
図1は、実施の形態1〜5に係る多倍長演算装置100の構成例を示すブロック図である。
実施の形態1〜5に係る多倍長演算装置100は、計算部101、メモリ102、通信ポート103がバス104で接続されている構成となっている。
なお、実施の形態1〜5に係る多倍長演算装置100は、演算装置の例に相当する。
プロセッサ105〜106のいずれかのプロセッサは、多倍長演算を行う際に必要な制御を行う制御部としての役割を有する。
また、プロセッサ105〜106のいずれかのプロセッサ、又は、プロセッサ105〜106の全てのプロセッサは、多倍長演算の計算処理を行う演算部としての役割を有する。
制御部として機能するプロセッサが、併せて演算部として機能するようにしてもよい。
プロセッサ105〜106が、制御部として行う処理の詳細、演算部として行う処理の詳細は、後述する。
演算部として機能するプロセッサは、所定の演算幅bビット(例えば32ビット)の演算を行う。
以下、演算幅のbビットを1ワードと記す。
また、以下では、制御部として機能するプロセッサを単に「制御部」とも記し、演算部として機能するプロセッサを単に「演算部」とも記す。
また、メモリ102を介してプロセッサ間でデータのやり取りを行う。
特殊レジスタ109は、プロセッサ105〜106の計算値以外の特殊情報を格納するレジスタである。
汎用レジスタ108及びメモリ102は、記憶部の例に相当する。
実施の形態1〜5に係る多倍長演算装置100の特徴の1つは、1つの多倍長演算を複数のスレッドを用いて演算することにある。
スレッドの本数n(n≧2)は、入力値をl(l>b)ビットとした場合、n≧ceil(l/b)とする。
ここで、ceil(a)はa以上の整数のうちの最小の整数とする。
各プロセッサが実行するスレッドには0以上(n−1)以下のスレッド番号が付与される。
プロセッサ105〜106はスレッドの本数や、各プロセッサが処理するスレッドの番号を、特殊レジスタ109から取得することができる。
また、図1では図示を省略しているが、多倍長演算装置100は、磁気ディスク装置に代表される不揮発性の記憶装置を備えている。
そして、制御部及び演算部の後述する動作を実現するためのコンピュータプログラムやオペレーティングシステムが不揮発性の記憶装置に記憶されている。
制御部及び演算部の動作を実現するためのコンピュータプログラムの少なくとも一部は、オペレーティングシステムに含まれていてもよい。
そして、プロセッサ105、106は、オペレーティングシステムを動作させながら、制御部及び演算部の動作を実現するためのコンピュータプログラムをメモリ102にロードし、また、これらコンピュータプログラムをメモリ102から読み出し、実行することで、制御部及び演算部として機能する。
また、多倍長演算装置10の動作手順を、演算方法として捉えることもできる。
入力値Xと入力値Yは、ともにl(l>b)ビットである。
つまり、入力値Xと入力値Yのビット幅(lビット)は、各プロセッサの1ワードであるbビットよりも大きい。
また、制御部は、入力値Xから分割されたn個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを、いずれかの記憶領域(例えば、メモリ102)に設ける。
また、制御部は、入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納する。
同様に、制御部は、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納する。
また、いずれかの記憶領域(例えば、メモリ102)に、演算部による加算結果を格納するためのu(u>n)個の変数Z[0]〜Z[u−1]を設ける。
なお、変数Zの個数は、n以上であれば任意の数とすることができるが、以下では、2n個の変数Z、つまり、変数Z[0]〜Z[2n−1]を設ける(変数Zが2nワードのサイズを持つ)例にて説明を進める。
演算部の処理は、第1フェーズの処理と、第2フェーズの処理に大別される。
そして、カウンタ値iがnに達するか、全てのスレッドtが第2フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、制御部は、カウンタ値iをインクリメントする。
第2フェーズの1ラウンド分の処理は、以下の〈a〉と〈b〉の処理である。
〈a〉(t+i)番目の変数Z[t+i]の値とスレッドtで得られたキャリー値cとを用いて、(Z[t+i]の値)+cを計算し、新たな加算結果と新たなキャリー値cを求める。
〈b〉変数Z[t+i]の値と新たな加算結果とを比較し、両者が一致している場合に、スレッドtの第2フェーズの処理を停止し、両者が一致しない場合に、新たな加算結果を(t+i)番目の変数Z[t+i]に格納する。
なお、図2において、大文字で示す変数はメモリ102上のデータとし、小文字で示す変数は汎用レジスタ108上のデータとする。
また、各変数のデータ長は1ワードとする。
また、入力値ceil(l/b)ワードがnに満たない場合は、満たない部分のワードを予め0でクリアする。
ここで、Add_cc(a,b)は、1ワードの入力a,bに対し、a+bの結果を汎用レジスタ108に出力し、キャリー値を特殊レジスタ109に出力することを意味する。
図2に示すS202の処理2及び処理3が、第1フェーズの処理に該当する。
ここで、Addc_cc(a,b)は、1ワードの入力a,bに対し、aとbと特殊レジスタ109のキャリーの値を加算し、加算結果を汎用レジスタ108に出力し、加算後のキャリー値を特殊レジスタ109に出力することを意味する。
また、演算部は、変化があれば(s==a?でNO)、加算結果を、Z[t+i]に出力し、制御部がiに1を加算する(S204)。
キャリー値が0になる(すなわち、s==a?でYESとなる)か、iがnとなるまでS203、S204を繰り返す。
n本のスレッド全てがループを抜けたら処理を終了する。
図2に示すS203の処理1及び処理2、s==a?の判断、S204の処理1が、第2フェーズの1ラウンド分の処理に該当する。
図3では、内容を理解しやすくするため、内部演算幅を十進数とし、4桁の演算を4つのスレッド(スレッド番号0〜3)で実行した場合を示している。図3では、1234(X)+5678(Y)=6912(Z)を計算する例を示す。
また、図4は、図3に示した計算の内訳を、スレッド番号0について示している。
本実施の形態では、各桁の加算は1回で終了し、その後、キャリーの処理を行う。
キャリーの処理のワーストケースはO(n)となるが、入力がランダムである場合、キャリーが最後まで残る確率は非常に低いため、数回のキャリーの計算で図2のループを抜けることができるため、加算処理を高速に行うことができる。
また、キャリー加算前後の値を比較することで、キャリー情報を直接参照できなくても、キャリーの有無を判定することができる。
また、本実施の形態に係る多倍長演算装置100は、前述したように、SIMD計算機等の通常の計算機で実現可能であり、専用装置を用いることなく、多倍長加算を高速に行うことができる。
複数のプロセッサを内蔵し、単一の命令を複数のデータに対して同時に実行できる計算機と、データを格納し、前記プロセッサが同時にアクセスできるメモリを有する多倍長整数演算装置であって、入力X,Yに対して、Z=X+Yを計算する多倍長加算を以下のステップで実行する多倍長整数演算装置を説明した。
1.入力データを計算機の内部演算幅毎に複数の桁(以降、それぞれX[n],Y[n]と記す)に分割するステップ
2.スレッドごとに自身のスレッド番号tと演算するスレッド本数nを取得するステップ
3.Zを0にセットするステップ
4.X[t]+Y[t]を計算し、加算結果とキャリーcを求め、前記加算結果をZ[t]に格納するステップ
5.桁iを1に設定するステップ
6.Z[t+i]+cを計算し、新たな加算結果と新たなキャリーcを求め、前記加算結果をZ[t+i]に格納するステップ
7.桁iに1を加算するステップ
8.i<nかつ、c≠0の間、ステップ6〜7を実行するステップ
9.前記スレッドの全てがステップ6〜8を完了するのを待つステップ。
本実施の形態では、多倍長減算処理を行う。
本実施の形態に係る多倍長演算装置100の構成は図1に示したものと同じである。
なお、実施の形態1と同様に、本実施の形態でも、入力値X、入力値Yのビット幅がl(l>b)ビットであり、制御部が入力値Xと入力値Yをそれぞれn桁に分割し、変数X[0]〜X[n−1]と変数Y[0]〜Y[n−1]とを設け、更に、変数Z[0]〜Z[2n−1]を設ける。
変数Zの個数は、本実施の形態でも、n以上であれば任意の数とすることができるが、実施の形態1と同様に、2n個の変数Zを設ける(変数Zが2nワードのサイズを持つ)例にて説明を進める。
また、制御部が分割値をX[0]〜X[n−1]を格納する手順、Y[0]〜Y[n−1]に格納する手順も実施の形態1と同じである。
更に、演算部も、実施の形態1と同様に、n個のスレッドを並列に実行し、第1フェーズの処理と、第2フェーズの処理とを行う。
そして、カウンタ値iがnに達するか、全てのスレッドtが第2フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、制御部は、カウンタ値iをインクリメントする。
第2フェーズの1ラウンド分の処理は、以下の〈a〉と〈b〉の処理である。
〈a〉(t+i)番目の変数Z[t+i]の値とスレッドtで得られたボロー値dとを用いて、(Z[t+i]の値)−dを計算し、新たな減算結果と新たなボロー値dを求める。
〈b〉変数Z[t+i]の値と新たな減算結果とを比較し、両者が一致している場合に、スレッドtの第2フェーズの処理を停止し、両者が一致しない場合に、新たな減算結果を(t+i)番目の変数Z[t+i]に格納する。
なお、図5において、大文字で示す変数はメモリ102上のデータとし、小文字で示す変数は汎用レジスタ108上のデータとする。
また、各変数のデータ長は1ワードとする。
入力値ceil(l/b)ワードがnに満たない場合は、満たない部分のワードを予め0でクリアする。
ここで、Sub_cc(a,b)は1ワードの入力a,bに対し、b−aの結果を汎用レジスタ108に出力し、ボロー値を特殊レジスタに出力することを意味する。
図5に示すS402の処理2及び処理3が、第1フェーズの処理に該当する。
ここで、Subc_cc(a,b)は1ワードの入力a,bに対し、bからaと特殊レジスタ109のボローの値を減算し、減算結果を汎用レジスタ108に出力し、ボロー値を特殊レジスタ109に出力することを意味する。
また、演算部は、変化があれば(s==a?でNO)、減算結果を、Z[t+i]に出力し、制御部がiに1を加算する(S404)。
ボロー値が0になる(すなわち、s==a?でYESとなる)か、iがnとなるまでS403、S404を繰り返す。
n本のスレッド全てがループを抜けたら処理を終了する。
図5に示すS403の処理1及び処理2、s==a?の判断、S404の処理1が、第2フェーズの1ラウンド分の処理に該当する。
図6では、内容を理解しやすくするため、内部演算幅を十進数とし、4桁の演算を4つのスレッド(スレッド番号0〜3)で実行した場合について示している。図6では、7634(Y)−5678(X)=1956(Z)を計算する例を示す。
また、図7は、図6に示した計算の内訳を、スレッド番号0について示している。
本実施の形態では、各桁の減算は1回で終了し、その後、ボローの処理を行う。
ボローの処理のワーストケースはO(n)となるが、入力がランダムである場合、ボローが最後まで残る確率は非常に低いため、数回のボローの計算で図5のループを抜けることができる。
よって、減算処理を高速に行うことができる。
また、ボロー減算前後の値を比較することで、ボロー情報を直接参照できなくても、ボローの有無を判定することができる。
また、本実施の形態に係る多倍長演算装置100は、前述したように、SIMD計算機等の通常の計算機で実現可能であり、専用装置を用いることなく、多倍長減算を高速に行うことができる。
複数のプロセッサを内蔵し、単一の命令を複数のデータに対して同時に実行できる計算機と、データを格納し、前記プロセッサが同時にアクセスできるメモリを有する多倍長整数演算装置であって、入力X,Yに対して、Z=Y−Xを計算する多倍長減算を以下のステップで実行する多倍長整数演算装置を説明した。
1.入力データを計算機の内部演算幅毎に複数の桁(以降、それぞれX[n],Y[n]と記す)に分割するステップ
2.スレッドごとに自身のスレッド番号tと演算するスレッド本数nを取得するステップ
3.Zを0にセットするステップ
4.Y[t]−X[t]を計算し、減算結果とボローdを求め、前記減算結果をZ[t]に格納するステップ
5.桁iを1に設定するステップ
6.Z[t+i]−cを計算し、新たな減算結果と新たなボローdを求め、前記減算結果をZ[t+i]に格納するステップ
7.桁iに1を加算するステップ
8.i<nかつ、c≠0の間、ステップ6〜7を実行するステップ
9.前記スレッドの全てがステップ6〜8を完了するのを待つステップ。
本実施の形態では、多倍長乗算処理を行う。
本実施の形態に係る多倍長演算装置100の構成は図1に示したものと同じである。
なお、実施の形態1と同様に、本実施の形態でも、入力値X、入力値Yのビット幅がl(l>b)ビットであり、制御部が入力値Xと入力値Yをそれぞれn桁に分割し、変数X[0]〜X[n−1]と変数Y[0]〜Y[n−1]とを設け、更に、変数Z[0]〜Z[2n−1]を設ける。
また、制御部が分割値をX[0]〜X[n−1]を格納する手順、Y[0]〜Y[n−1]に格納する手順も実施の形態1と同じである。
更に、演算部も、実施の形態1と同様に、n個のスレッドを並列に実行し、第1フェーズの処理と、第2フェーズの処理とを行う。
また、制御部は、カウンタ値iがnに達するまでの間、演算部が第1フェーズの1ラウンド分の処理を終了する度に、カウンタ値iをインクリメントする。
第1フェーズの1ラウンド分の処理は、以下の〈1−a〉と〈1−b〉の処理である。
〈1−a〉入力値Xのt番目の変数X[t]の値と、入力値Yのi番目の変数Y[i]の値と、(t+i)番目の変数Z[t+i]の値と、スレッドtで得られたキャリー成分値cとを用いて、(X[t]の値)×(Y[i]の値)+(Z[t+i]の値)+cを計算する。
〈1−b〉計算結果の下位1ワードの値を(t+i)番目の変数Z[t+i]に格納し、計算結果の上位1ワードの値を新たなキャリー成分値cとする。
そして、制御部は、カウンタ値iが2nに達するまでの間、演算部が第2フェーズの1ラウンド分の処理を終了する度に、カウンタ値iをインクリメントする。
第2フェーズの1ラウンド分の処理は、以下の〈2−a〉と〈2−b〉の処理である。
〈2−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第2フェーズの処理を停止する。
〈2−b〉0でない場合に(Z[t+i]の値)+cを計算し、計算結果の下位1ワードの値を変数Z[t+i]の新たな値とし、計算結果の上位1ワードの値を新たなキャリー成分値cとする。
なお、図8において、大文字で示す変数はメモリ102上のデータとし、小文字で示す変数は汎用レジスタ108上のデータとする。
また、各変数のデータ長は1ワードとする。
ただし、図8において太字で表記している変数は2ワードとする。
なお、明細書では、2ワードの変数は、ダブルクオーテーションで表現する(例えば、“m”)。
また、入力値ceil(l/b)ワードがnに満たない場合は、満たない部分のワードを予め0でクリアする。
つまり、演算部は、“m”=X[t]×Y[i]+Z[t+i]+“c”を計算する。
更に、演算部は、“m”の下位1ワードをZ[t+i]に、上位1ワードを“c”に出力する。
次に、制御部が、iに1を加算する(S602)。
ここで、Mul_w(a,b)は1ワードのaとbの積を求め、2ワードの乗算結果を出力することを意味する。
なお、図8のS602の処理1〜4が、第1フェーズの1ラウンド分の処理に相当する。
つまり、演算部は、キャリー成分値“c”が0であるか否かを判断し、“c”が0でない場合に(“c”==0?でNO)、“c”=Z[t+i]+“c”を計算し、“c”の下位1ワードをZ[t+i]に、上位1ワードを“c”に出力する。
そして、制御部が、変数iに1を加算する(S603)。
i≧2nまたは“c”=0となるまでループを繰り返す。
つまり、演算部は、変数iが2nに達するまでの間、制御部により変数iがインクリメントされる度に、停止していないスレッドtにおいて、スレッドtで得られたキャリー成分値“c”が0であるか否かを判断し、キャリー成分値“c”が0である場合(“c”==0?でYES)にスレッドtの処理を停止し、キャリー成分値“c”が0でない場合(“c”==0?でNO)は、S603の処理を行う。
n本のスレッド全てがループを抜けたら処理を終了する。
なお、図8に示すS603の処理1〜3、“c”==0?の判断が、第2フェーズの1ラウンド分の処理に該当する。
図9及び図10では、内容を理解しやすくするため、内部演算幅を十進数とし、4桁の演算を4つのスレッド(スレッド番号0〜3)で実行した場合について示している。図9及び図10では、1234(X)*5678(Y)=7006652(Z)を計算する例を示す。
なお、図10には、図9との連続性を明示するために、図9の最下段に示しているi=3の際の計算過程を再度提示している。
また、図11及び図12は、図9及び図10に示した計算の内訳を、スレッド番号0について示している。
本実施の形態では、乗算処理はn回のループで終了する。
また、乗算処理中にキャリーの加算処理も行う点は、本実施の形態の多倍長乗算の特徴の1つである。
キャリー処理のワーストケースはO(n)となるが、入力がランダムである場合、キャリーが最後まで残る確率は非常に低いため、数回のキャリーの計算でループを抜けることができる。
よって、多倍長乗算処理はn+α(α<n)で行うことができる。
また、本実施の形態に係る多倍長演算装置100は、前述したように、SIMD計算機等の通常の計算機で実現可能であり、専用装置を用いることなく、多倍長乗算を高速に行うことができる。
複数のプロセッサを内蔵し、単一の命令を複数のデータに対して同時に実行できる計算機と、データを格納し、前記プロセッサが同時にアクセスできるメモリを有する多倍長整数演算装置であって、入力X,Yに対して、Z=XYを計算する多倍長乗算を以下のステップで実行する多倍長整数演算装置を説明した。
1.入力データを計算機の内部演算幅毎に複数の桁(以降、それぞれX[n],Y[n]と記す)に分割するステップ
2.出力Z,キャリーc,桁iに0をセットするステップ
3.“m”=X[t]×Y[i]+Z[t+i]+cを計算し、“m”の下位1ワードをZ[t+i]に、上位1ワードをcに出力するステップ
4.桁iに1を加算するステップ
5.i<nの間、ステップ3〜4を実行するステップ
6.c=Z[t+i]+cを計算し、cの下位1ワードをZ[t+i]に、上位1ワードをcに出力するステップ
7.iに1を加算するステップ
8.i<2nかつ、c≠0の間、ステップ6〜7を実行するステップ
9.前記スレッドの全てがステップ6〜8を完了するのを待つステップ。
本実施の形態では、多倍長モンゴメリ・リダクション処理を行う。
本実施の形態に係る多倍長演算装置100の構成は図1に示したものと同じである。
なお、上記のnは、法Mを1ワードごとに分割した際の法Mの分割数であり、n≧2である。
また、本実施の形態では、入力値Xを1ワードごとに分割した際の入力値Xの分割数は、2nであるとする。
また、制御部は、入力値Xから分割された2n個の分割値を格納するための2n個の変数X[0]〜X[2n−1]を、いずれかの記憶領域(例えば、メモリ102)に設ける。
また、制御部は、入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(2n−1)番目の変数X[2n−1]に格納されるようにして、2n個の分割値を変数X[0]〜X[2n−1]に格納する。
また、制御部は、いずれかの記憶領域(例えば、メモリ102)に、法Mから分割されたn個の分割値を格納するためのn個の変数M[0]〜M[n−1]を設ける。
また、制御部は、法M内の最下位ビットが含まれる分割値が0番目の変数M[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数M[n−1]に格納されるようにして、n個の分割値を変数M[0]〜M[n−1]に格納する。
更に、制御部は、いずれかの記憶領域(例えば、メモリ102)に、演算部による計算結果を格納するn個の変数Z[0]〜Z[n−1]を設ける。
演算部の処理は、第1フェーズ〜第4フェーズの処理に大別される。
〈1−a〉スレッドtにおいて、入力値Xの0番目の変数X[0]の値とMInvとを用いて、(X[0]の値)×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとする。
〈1−b〉スレッドtにおいて、法Mのt番目の変数M[t]の値と、入力値Xのt番目の変数X[t]の値と、前記uとを用いて、(M[t]の値)×u+(X[t]の値)を計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[t]の新たな値とし、計算結果mの上位1ワードの値をキャリー成分値cとする。
〈1−c〉0番目のスレッドであるスレッド0において、スレッド0で得られたキャリー成分値cの下位1ワードの値を変数X[0]の新たな値とする。
そして、カウンタ値iがnに達するまで、全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントする。
第2フェーズの1ラウンド分の処理は、以下の〈2−a〉と〈2−b〉の処理である。
〈2−a〉スレッドtにおいて、入力値Xの0番目の変数X[0]の値とi番目の変数X[i]の値と、MInvとを用いて、{(X[0]の値)+(X[i]の値)}×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとする。
〈2−b〉スレッドtにおいて、法Mのt番目の変数M[t]の値と、前記uと、入力値Xの(t+i)番目の変数X[t+i]の値と、スレッドtで得られたキャリー成分値cとを用いて、(M[t]の値)×u+(X[t+i]の値)+cを計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[t+i]の新たな値とし、計算結果mの上位1ワードの値を新たなキャリー成分値cとする。
〈2−c〉0番目のスレッドであるスレッド0において、スレッド0で得られたキャリー成分値cの下位1ワードの値を変数X[0]の新たな値とする。
また、演算部は、カウンタ値iがnに達すると、スレッド0において、値0を変数X[0]の新たな値とする。
そして、カウンタ値iが2nに達するか、全てのスレッドtが第3フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第3フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントする。
第3フェーズの1ラウンド分の処理は、以下の〈3−a〉と〈3−b〉の処理である。
〈3−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第3フェーズの処理を停止する。
〈3−b〉0でない場合に、(X[(t+i) mod 2n]の値)+cを計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[(t+i) mod 2n]の新たな値とし、計算結果mの上位1ワードの値を新たなキャリー成分値cとする。
変数X[0]の値を変数aに格納し、変数X[n]〜X[2n−1]の値を、それぞれ、変数X[0]〜X[n−1]に格納する。
変数aの値が0でない場合、又は変数X[n−1]〜X[0]の値を連接して得られる値が法M以上の場合に、X−Mを計算し、計算結果を変数X[0]〜X[n−1]に格納し、変数X[0]〜X[n−1]の値を変数Z[0]〜Z[n−1]に格納する。
図13では、入力値Xのモンゴメリ・リダクションの結果XR−1 mod Mを変数Zに出力する。
入力値Xは2n桁に分割され、n個のスレッドを用いて計算を行う。
また、入力値XはX<M・Rの関係を満たすものとする。
ここで、R=rnとし、r=2bとする。
Zはnワードのサイズを持つ。
MInvは−M−1 mod rを満たす1ワード整数である。
また、各変数のデータ長は1ワードとする。
ただし、図13において太字で表記した変数は2ワードとする。
なお、明細書では、2ワードの変数は、ダブルクオーテーションで表現する(例えば、“m”)。
また、入力値ceil(l/b)ワードがnに満たない場合は、満たない部分のワードを予め0でクリアする。
具体的には、演算部が、X[0]×MInvの下位1ワードuを求め、“m”=M[t]×u+X[t]を計算する。
ここで、Mul_lo(a,b)は1ワード入力a,bに対し、a×bを計算し、下位1ワードを出力することを意味する。
そして、演算部は、“m”の下位1ワードをX[t]に出力し、上位1ワードを“c”に出力する(S802)。
また、演算部は、スレッド番号が0である場合(t==0?でYES)、“c”の下位1ワードをX[0]に出力する(S803)。
なお、図13のS802とS803が第1フェーズの処理に相当する。
また、演算部は、“m”の下位1ワードをX[t+i]に出力し、上位1ワードを“c”に出力する。
そして、制御部が、変数iに1を加算する(S804)。
また、演算部は、スレッド番号が0である場合(t==0?でYES)、“c”の下位1ワードをX[0]に出力する(S805)。
なお、図13のS804の処理1〜6、S805が、第2フェーズの1ラウンド分の処理に該当する。
始めに、演算部は、スレッド番号が0である場合(t==0?でYES)、X[0]に0を出力する(S806)。
また、演算部は、“m”=X[(t+i)%2n]+“c”を計算し、“m”の下位1ワードをX[(t+i)%2n]に、上位1ワードを“c”に出力する。
制御部が、変数iに1を加算する(S807)。
i≧2nまたは“c”=0となるまでループを繰り返す。
つまり、演算部は、変数iが2nに達するまでの間、制御部により変数iがインクリメントされる度に、停止していないスレッドtにおいて、スレッドtで得られたキャリー成分値“c”が0であるか否かを判断し、キャリー成分値“c”が0である場合(“c”==0?でYES)にスレッドtの処理を停止し、キャリー成分値“c”が0でない場合(“c”==0?でNO)は、S807の処理を行う。
そして、n本のスレッド全てがループを抜けたらキャリー処理を終了する。
なお、図13に示す“c”==0?の判断、S807の処理1〜4が、第3フェーズの1ラウンド分の処理に該当する。
この場合、後述の減算処理で変数aに格納するデータはX[2n]になることに注意する。
演算部は、まず、X[0]の値を変数aに出力し、Xの値をnワードシフトする(S808)。
つまり、演算部は、変数X[n]〜X[2n−1]の値を、それぞれ、変数X[0]〜X[n−1]に格納する。
そして、aの値が0でないか、X[n−1,…,0]の値(X[n−1]〜X[0]の値を連接して得られる値)が法M以上の場合は、演算部は、多倍長整数減算X−Mを実行し、結果をXに格納する(S809)。
最後に、演算部は、X[0]〜X[n−1]の値をZ[0]〜Z[n−1]に格納する(S810)。
なお、図13に示すS808〜S810が、第4フェーズの処理に相当する。
図14及び図15では、内容を理解しやすくするため、内部演算幅を十進数とし、4桁の演算を4つのスレッド(スレッド番号0〜3)で実行した場合について示す。図14及び図15では、2345678(X)*R−1 mod 3511(M)=1745(Z)を計算する例を示す。
この場合、n=4、R=10n=104、r=10、MInv=−3511−1 mod 10=9となる。
なお、図15には、図14との連続性を明示するために、図14の最下段に示しているi=3の際の計算過程を再度提示している。
また、図16及び図17は、図14及び図15に示した計算の内訳を、スレッド番号0について示している。
本実施の形態では、モンゴメリ・リダクション処理はn回のループで終了する。
モンゴメリ・リダクション処理中にキャリーの加算処理も行う点が、本実施の形態の特徴の1つである。
また、各ステップで、最下位の桁を処理するスレッドのキャリーをメモリに出力することで、計算量をO(n)にすることができる。
キャリー処理のワーストケースはO(n)となるが、入力がランダムである場合、キャリーが最後まで残る確率は非常に低いため、数回のキャリーの計算でループを抜けることができる。
また、2nで剰余をとることで、多倍長整数乗算と同じメモリサイズでモンゴメリ・リダクションを行うことができる。
さらに、nが2のべき乗の場合、演算コストの大きい剰余演算を、演算コストの小さいビット演算で実現することができる。
また、本実施の形態に係る多倍長演算装置100は、前述したように、SIMD計算機等の通常の計算機で実現可能であり、専用装置を用いることなく、モンゴメリ・リダクションを高速に行うことができる。
このため、図13のS807の処理1及び処理3で2nの剰余演算を行うことにした。
しかし、メモリが十分にある場合は、入力値Xを格納する変数Xを、v個(但し、vはnの倍数、つまり、vは3n、4n等)で構成してもよい。ただし、入力Xに格納される値の範囲は0≦X<MRを満たすものとする。
このような変数Xの場合は、図13のS807の処理1及び処理3における2nの剰余演算は省略される。
また、同様に、減算処理(図13のS808の処理1)で変数aに格納するデータはX[2n]になる。
更に、減算処理(図13のS808の処理2)で、X[n]〜X[2n−1]の値を、それぞれ、X[0]〜X[n−1]に格納する。
複数のプロセッサを内蔵し、単一の命令を複数のデータに対して同時に実行できる計算機と、データを格納し、前記プロセッサが同時にアクセスできるメモリを有する多倍長整数演算装置であって、入力X,法M,内部演算幅b(bit)に対し、“r=2b”,“R=rn”として定義されたRと、“−M−1 mod r”として定義されたMInvを用いて、Z=XR−1 mod Mを計算するモンゴメリ・リダクションを以下のステップで実行する多倍長整数演算装置を説明した。
1.入力データと法を計算機の内部演算幅毎に複数の桁(以降、それぞれX[n],M[n]と記す)に分割するステップ
2.スレッドごとに自身のスレッド番号tと演算するスレッド本数nを取得するステップ
3.X[0]×MInvの下位1ワードuを求め、“m”=M[t]×u+X[t]を計算するステップ
4.“m”の下位1ワードをX[t]に出力し、上位1ワードを“c”に出力するステップ
5.スレッド番号が0である場合、“c”の下位1ワードをX[0]に出力するステップ
6.桁iに1を設定するステップ
7.(X[0]+X[i])×MInvの下位1ワードuを求め、“m”=M[t]×u+X[t+i]+“c”を計算するステップ
8.“m”の下位1ワードをX[t+i]に出力し、上位1ワードを“c”に出力するステップ
9.スレッド番号が0である場合、cの下位1ワードをX[0]に出力するステップ
10.桁iに1を加算するステップ
11.i<nの間、ステップ6〜9を実行するステップ
12.スレッド番号が0である場合、X[0]に0を出力するステップ
13.“m”=X[(t+i)%2n]+“c”を計算し、“m”の下位1ワードをX[(t+i)%2n]に、上位1ワードを“c”に出力するステップ
14.桁iに1を加算するステップ
15.i<2nかつ、c≠0の間、ステップ13〜14を実行するステップ
16.前記スレッドの全てがステップ13〜15を完了するのを待つステップ
17.X[0]の値を変数aに取得するステップ
18.Xの値をnワードシフトするステップ
19.aの値が0でないか、X[n−1,…,0]の値がM以上の場合は、多倍長整数減算X−Mを実行し、結果をXに格納するステップ
20.X[0]〜X[n−1]の値をZ[0]〜Z[n−1]に格納するステップ
上記のステップ12にて、“m”=X[t+i]+“c”を計算し、“m”の下位1ワードをX[t+i]に、上位1ワードを“c”に出力するステップを実行し、上記のステップ17にて、X[2n]の値を変数aに取得するステップを実行する多倍長整数演算装置を説明した。
本実施の形態では、多倍長モンゴメリ乗算処理を行う。
本実施の形態に係る多倍長演算装置100の構成は図1に示したものと同じである。
なお、上記のnは、法Mを1ワードごとに分割した際の法Mの分割数であり、n≧2である。
また、本実施の形態では、入力値Xを1ワードごとに分割した際の入力値Xの分割数、入力値Yを1ワードごとに分割した際の入力値Yの分割数は、それぞれnであるとする。
また、制御部は、入力値Xから分割されたn個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを、いずれかの記憶領域(例えば、メモリ102)に設ける。
また、制御部は、入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納する。
更に、制御部は、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納する。
また、制御部は、法Mから分割されたn個の分割値を格納するためのn個の変数M[0]〜M[n−1]を、いずれかの記憶領域(例えば、メモリ102)に設ける。
また、制御部は、法M内の最下位ビットが含まれる分割値が0番目の変数M[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数M[n−1]に格納されるようにして、n個の分割値を変数M[0]〜M[n−1]に格納する。
また、制御部は、演算部による計算結果を格納する2n個の変数Z[0]〜Z[2n−1]を、いずれかの記憶領域(例えば、メモリ102)に設ける。
演算部の処理は、第1フェーズ〜第4フェーズの処理に大別される。
〈1−a〉スレッドtにおいて、入力値Xの0番目の変数X[0]の値と、入力値Yの0番目の変数Y[0]の値と、MInvとを用いて、(X[0]の値)×(Y[0]の値)×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとする。
〈1−b〉スレッドtにおいて、法Mのt番目の変数M[t]の値と前記uとを用いて、(M[t]の値)×uを計算し、2ワードの計算結果をumとする。
〈1−c〉スレッドtにおいて、入力値Xの0番目の変数X[0]の値と入力値Yのt番目の変数Y[t]の値とを用いて、(X[0]の値)×(Y[t]の値)を計算し、2ワードの計算結果をxyとする。
〈1−d〉スレッドtにおいて、前記umの下位1ワードと前記xyの下位1ワードとを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値をt番目の変数Z[t]に格納する。
〈1−e〉スレッドtにおいて、前記mの上位1ワードと前記umの上位1ワードと前記xyの上位1ワードとを加算し、2ワードの計算結果をキャリー成分値cとする。
〈1−f〉0番目のスレッドであるスレッド0において、スレッド0で得られたキャリー成分値cの下位1ワードの値を変数Z[0]の新たな値とする。
そして、制御部は、カウンタ値iがnに達するまで、全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントする。
第2フェーズの1ラウンド分の処理は、以下の〈2−a〉〜〈2−f〉の処理である。
〈2−a〉スレッドtにおいて、0番目の変数Z[0]とi番目の変数Z[i]と、入力値Xのi番目の変数X[i]と、入力値Yの0番目の変数Y[0]と、MInvとを用いて、{(Z[0]の値)+(Z[i]の値)+(X[i]の値)×(Y[0]の値)}×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとする。
〈2−b〉スレッドtにおいて、法Mのt番目の変数M[t]の値と前記uとを用いて、(M[t]の値)×uを計算し、2ワードの計算結果をumとする。
〈2−c〉スレッドtにおいて、入力値Xのi番目の変数X[i]の値と入力値Yのt番目の変数Y[t]の値とを用いて、(X[i]の値)×(Y[t]の値)を計算し、2ワードの計算結果をxyとする。
〈2−d〉スレッドtにおいて、前記umの下位1ワードと、前記xyの下位1ワードと、ステップtで得られたキャリー成分値cの下位1ワードと、(t+i)番目の変数Z[t+i]の値とを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を(t+i)番目の変数Z[t+i]の新たな値とする。
〈2−e〉スレッドtにおいて、前記mの上位1ワードと、前記umの上位1ワードと、前記xyの上位1ワードと、ステップtで得られたキャリー成分値cの上位1ワードとを加算し、2ワードの計算結果を新たなキャリー成分値cとする。
〈2−f〉0番目のスレッドであるスレッド0において、スレッド0で得られたキャリー成分値cの下位1ワードの値を変数Z[0]の新たな値とする。
また、演算部は、カウンタ値iがnに達すると、スレッド0において、値0を変数Z[0]の新たな値とする。
そして、制御部は、カウンタ値iが2nに達するか、全てのスレッドtが第3フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第3フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントする。
第3フェーズの1ラウンド分の処理は、以下の〈3−a〉及び〈3−b〉の処理である。
〈3−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第3フェーズの処理を停止する。
〈3−b〉0でない場合に、スレッドtで得られたキャリー成分値cの下位1ワードと変数Z[(t+i) mod 2n]の値とを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数Z[(t+i) mod 2n]の新たな値とし、前記mの上位1ワードとスレッドtで得られたキャリー成分値cの上位1ワードとを加算し、2ワードの計算結果を新たなキャリー成分値cとする。
変数Z[0]の値を変数aに格納し、変数Z[n]〜Z[2n−1]の値を、それぞれ、変数Z[0]〜Z[n−1]に格納する。
変数aの値が0でない場合、又は変数Z[n−1]〜Z[0]の値を連接して得られる値が法M以上の場合に、Z−Mを計算し、計算結果を変数Z[0]〜Z[n−1]に格納する。
図18では、入力値X,Yのモンゴメリ乗算の結果XYR−1 mod MをZに出力する。
Zは2nワードのサイズをもち、中間変数値の格納も行う。
入力値X,Yはn桁に分割され、n個のスレッドを用いて計算を行う。
また、入力値X,YはX,Y<Mの関係を満たすものとする。
ここで、R=rnとし、r=2bとする。
MInvは−M−1 mod rを満たす1ワード整数である。
また、各変数のデータ長は1ワードとする。
ただし、図18において太字で表記した変数は2ワードとする。
なお、明細書では、2ワードの変数は、ダブルクオーテーションで表現する(例えば、“c”)。
また、入力値ceil(l/b)ワードがnに満たない場合は、満たない部分のワードを予め0でクリアする。
具体的には、演算部が、X[0]×Y[0]×MInvの下位1ワードuを求め、M[t]×u+X[0]×Y[t]を計算する。
計算を2ワード以下の変数で行うため、M[t]×u,X[0]×Y[t]を上位ワードと下位ワードに分解し、下位ワードみの加算を行なった後、加算結果の下位1ワードをZ[t]に出力する。
また、演算部は、前記加算結果の上位ワードと前記M[t]×u,X[0]×Y[t]の上位ワードを加算し、2ワードデータ“c”を生成する(S1002)。
演算部は、スレッド番号が0である場合(t==0?でYES)、“c”の下位1ワードをZ[0]に出力する(S1003)。
なお、図18のS1002とS1003が第1フェーズの処理に相当する。
計算を2ワード以下の変数で行うため、M[t]×u,X[0]×Y[t],“c”を上位ワードと下位ワードに分解し、下位ワードみの加算を行なった後、加算結果の下位1ワードをZ[t+i]に出力する。
また、演算部は、前記加算結果の上位ワードと前記M[t]×u,X[0]×Y[t],“c”の上位ワードを加算し、2ワードデータ“c”を生成する。
また、制御部が、変数iに1を加算する(S1004)。
演算部は、スレッド番号が0である場合(t==0?でYES)、“c”の下位1ワードをZ[0]に出力する(S1005)。
なお、図18のS1004の処理1〜15、S1005が、第2フェーズの1ラウンド分の処理に該当する。
始めに、演算部は、スレッド番号が0である場合(t==0?でYES)、Z[0]に0を出力する(S1006)。
次に、演算部は、Z[(t+i)%2n]+“c”を計算する。
計算を2ワード以下の変数で行うため、“c”を上位ワードと下位ワードに分解し、下位ワードみの加算を行なった後、加算結果の下位1ワードをZ[(t+i)%2n]に出力する。
また、演算部は、前記加算結果の上位ワードと前記“c”の上位ワードを加算し、2ワードデータ“c”を生成する。
制御部が、変数iに1を加算する(S1007)。
i≧2nまたは“c”=0となるまでループを繰り返す。
つまり、演算部は、変数iが2nに達するまでの間、制御部により変数iがインクリメントされる度に、停止していないスレッドtにおいて、スレッドtで得られたキャリー成分値“c”が0であるか否かを判断し、キャリー成分値“c”が0である場合(“c”==0?でYES)にスレッドtの処理を停止し、キャリー成分値“c”が0でない場合(“c”==0?でNO)は、S1007の処理を行う。
そして、n本のスレッド全てがループを抜けたらキャリー処理を終了する。
なお、図18に示す“c”==0?の判断、S1007の処理1〜4が、第3フェーズの1ラウンド分の処理に該当する。
この場合、後述の減算処理で変数aに格納するデータはZ[2n]になることに注意する。
演算部は、まず、Z[0]の値を変数aに出力し、Zの値をnワードシフトする(S1008)。
つまり、演算部は、変数Z[n]〜Z[2n−1]の値を、それぞれ、変数Z[0]〜Z[n−1]に格納する。
そして、aの値が0でないか、Z[n−1,…,0]の値(Z[n−1]〜Z[0]の値を連接して得られる値)が法M以上の場合は、演算部は、多倍長整数減算Z−Mを実行し、結果をZに格納する(S1009)。
最後に、演算部は、Z[0]〜Z[n−1]を出力する。
なお、図13に示すS1008、S1009及びZ[0]〜Z[n−1]の出力が、第4フェーズの処理に相当する。
図19及び図20では、内容を理解しやすくするため、内部演算幅を十進数とし、4桁の演算を4つのスレッド(スレッド番号0〜3)で実行した場合について示す。図14及び図15では、5678(X)*4321(Y)*R−1 mod 6131(M)=3736(Z)を計算する例を示す。
この場合、n=4、R=10n=104、r=10、MInv=−6131−1 mod 10=9となる。
なお、図20には、図19との連続性を明示するために、図19の最下段に示しているi=3の際の計算過程(一部)を再度提示している。
また、図21及び図22は、図19及び図20に示した計算の内訳を、スレッド番号0について示している。
本実施の形態では、モンゴメリ乗算処理はn回のループで終了する。
モンゴメリ乗算処理中にキャリーの加算処理も行う点が、本実施の形態の特徴の1つである。
また、加算データを上位と下位で分割して加算することで、3ワードの変数が必要な計算を、2ワード以下の変数で行うことができる。
さらに、各ステップで、最下位の桁を処理するスレッドのキャリーをメモリに出力することで、計算量をO(n)にすることができる。
キャリー処理のワーストケースはO(n)となるが、入力がランダムである場合、キャリーが最後まで残る確率は非常に低いため、数回のキャリーの計算でループを抜けることができる。
また、2nで剰余をとることで、多倍長整数乗算と同じメモリサイズでモンゴメリ乗算処理を実現することができる。
さらに、nが2のべき乗の場合、演算コストの大きい剰余演算を、演算コストの小さいビット演算で実現することができる。
また、本実施の形態に係る多倍長演算装置100は、前述したように、SIMD計算機等の通常の計算機で実現可能であり、専用装置を用いることなく、モンゴメリ乗算を高速に行うことができる。
このため、図18のS1007の処理3及び処理4で2nの剰余演算を行うことにした。
しかし、変数Zは、vワード(但し、vはnの倍数、つまり、vは3n、4n等)で構成してもよい。
このような変数Zの場合は、図18のS1007の処理3及び処理4における2nの剰余演算は省略される。
また、同様に、減算処理(図18のS1008の処理1)で変数aに格納するデータはZ[2n]になる。
更に、減算処理(図18のS1008の処理2)で、Z[n]〜Z[2n−1]の値を、それぞれ、Z[0]〜Z[n−1]に格納する。
複数のプロセッサを内蔵し、単一の命令を複数のデータに対して同時に実行できる計算機と、データを格納し、前記プロセッサが同時にアクセスできるメモリを有する多倍長整数演算装置であって、入力X,Y,法M,内部演算幅b(bit)に対し、“r=2b”,“R=rn”として定義されたRと、“−M−1 mod r”として定義されたMInvを用いて、Z=XYR−1 mod Mを計算するモンゴメリ乗算を以下のステップで実行する多倍長整数演算装置を説明した。
1.入力データと法を計算機の内部演算幅毎に複数の桁(以降、それぞれX[n],Y[n],M[n]と記す)に分割するステップ
2.スレッドごとに自身のスレッド番号tと演算するスレッド本数nを取得するステップ
3.Zを0にセットするステップ
4.X[0]×Y[0]×MInvの下位1ワードuを求め、M[t]×uとX[0]×Y[t]を計算するステップ
5.前記M[t]×uとX[0]×Y[t]の下位ワードみの加算を行なった後、加算結果の下位1ワードをZ[t]に出力するステップ
6.前記加算結果の上位ワードと前記M[t]×u,X[0]×Y[t]の上位ワードを加算し、2ワードデータ“c”を生成するステップ
7.スレッド番号が0である場合、“c”の下位1ワードをZ[0]に出力するステップ
8.桁iに1を設定するステップ
9.(Z[0]+Z[i]+X[i]×Y[0])×MInvの下位1ワードuを求め、M[t]×uとX[i]×Y[t]を計算するステップ
10.前記M[t]×u,X[0]×Y[t],“c”の下位ワードとZ[t+i]との加算を行なった後、加算結果の下位1ワードをZ[t+i]に出力するステップ
11.前記加算結果の上位ワードと前記M[t]×u,X[0]×Y[t],“c”の上位ワードを加算し、2ワードデータ“c”を生成するステップ
12.変数iに1を加算するステップ
13.スレッド番号が0である場合、“c”の下位1ワードをZ[0]に出力するステップ
14.i<nの間、ステップ9〜13を実行するステップ
15.スレッド番号が0である場合、Z[0]に0を出力するステップ
16.“c”の下位ワードとZ[(t+i)%2n]との加算を行なった後、加算結果の下位1ワードをZ[(t+i)%2n]に出力するステップ
17.前記加算結果の上位ワードと前記“c”の上位ワードを加算し、2ワードデータ“c”を生成するステップ
18.桁iに1を加算するステップ
19.i<2nかつ、c≠0の間、ステップ16〜18を実行するステップ
20.前記スレッドの全てがステップ16〜18を完了するのを待つステップ
21.Z[0]の値を変数aに取得するステップ
22.Zの値をnワードシフトするステップ
23.aの値が0でないか、Z[n−1,…,0]の値がM以上の場合は、多倍長整数減算Z−Mを実行し、結果をZに格納するステップ
上記のステップ16にて、“c”の下位ワードとZ[(t+i)]との加算を行なった後、加算結果の下位1ワードをZ[(t+i)]に出力するステップを実行し、上記のステップ21にて、Z[2n]の値を変数aに取得するステップを実行する多倍長整数演算装置を説明した。
Claims (8)
- 制御部と演算部と記憶部とを有し、入力値の加算を行う演算装置であって、
前記制御部は、
それぞれのビット幅が共通しており、それぞれのビット幅が前記演算部の演算ビット幅よりも大きい入力値X及び入力値Yを、それぞれ、前記演算部の演算ビット幅ごとに分割し、
前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割されたn(n≧2)個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを設け、
入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納し、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納し、
前記記憶部内の所定の記憶領域を割当てて、前記演算部による加算結果を格納するためのu(u>n)個の変数Z[0]〜Z[u−1]を設け、
前記演算部は、
スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、第1フェーズの処理として、
入力値Xのt番目の変数X[t]の値と、入力値Yのt番目の変数Y[t]の値とを用いて、(X[t]の値)+(Y[t]の値)を計算し、加算結果とキャリー値cを求め、加算結果をt番目の変数Z[t]に格納する処理を行い、
前記制御部は、
カウンタ値iを1に設定し、前記演算部に第2フェーズの処理を開始させ、
カウンタ値iがnに達するか、全てのスレッドtが第2フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
前記演算部は、
前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第2フェーズの1ラウンド分の処理として、
〈a〉(t+i)番目の変数Z[t+i]の値とスレッドtで得られたキャリー値cとを用いて、(Z[t+i]の値)+cを計算し、新たな加算結果と新たなキャリー値cを求め、
〈b〉変数Z[t+i]の値と新たな加算結果とを比較し、両者が一致している場合に、スレッドtの第2フェーズの処理を停止し、両者が一致しない場合に、新たな加算結果を(t+i)番目の変数Z[t+i]に格納する
処理を、行うことを特徴とする演算装置。 - 制御部と演算部と記憶部とを有し、入力値の減算を行う演算装置であって、
それぞれのビット幅が共通しており、それぞれのビット幅が前記演算部の演算ビット幅よりも大きい入力値X及び入力値Yを、それぞれ、前記演算部の演算ビット幅ごとに分割し、
前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割されたn(n≧2)個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを設け、
入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納し、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納し、
前記記憶部内の所定の記憶領域を割当てて、前記演算部による減算結果を格納するためのu(u>n)個の変数Z[0]〜Z[u−1]を設け、
前記演算部は、
スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、第1フェーズの処理として、
入力値Xのt番目の変数X[t]の値と、入力値Yのt番目の変数Y[t]の値とを用いて、(Y[t]の値)−(X[t]の値)を計算し、減算結果とボロー値dを求め、減算結果をt番目の変数Z[t]に格納する処理を行い、
前記制御部は、
カウンタ値iを1に設定し、前記演算部に第2フェーズの処理を開始させ、
カウンタ値iがnに達するか、全てのスレッドtが第2フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
前記演算部は、
前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第2フェーズの1ラウンド分の処理として、
〈a〉(t+i)番目の変数Z[t+i]の値とスレッドtで得られたボロー値dとを用いて、(Z[t+i]の値)−dを計算し、新たな減算結果と新たなボロー値dを求め、
〈b〉変数Z[t+i]の値と新たな減算結果とを比較し、両者が一致している場合に、スレッドtの第2フェーズの処理を停止し、両者が一致しない場合に、新たな減算結果を(t+i)番目の変数Z[t+i]に格納する
処理を、行うことを特徴とする演算装置。 - 制御部と演算部と記憶部とを有し、入力値の乗算を行う演算装置であって、
前記制御部は、
それぞれのビット幅が共通しており、それぞれのビット幅が前記演算部の演算ビット幅である1ワードよりも大きい入力値X及び入力値Yを、それぞれ、1ワードごとに分割し、
前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割されたn(n≧2)個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを設け、
入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納し、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納し、
前記記憶部内の所定の記憶領域を割当てて、前記演算部による計算結果を格納するためのu(u>n)個の変数Z[0]〜Z[u−1]を設け、
カウンタ値iを0に設定し、前記演算部に第1フェーズの処理を開始させ、
カウンタ値iがnに達するまでの間、前記演算部が第1フェーズの1ラウンド分の処理を終了する度に、カウンタ値iをインクリメントし、
前記演算部は、
スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
カウンタ値iがnに達するまでの間、前記制御部によりカウンタ値iがインクリメントされる度に、スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、第1フェーズの1ラウンド分の処理として、
〈1−a〉入力値Xのt番目の変数X[t]の値と、入力値Yのi番目の変数Y[i]の値と、(t+i)番目の変数Z[t+i]の値と、スレッドtで得られたキャリー成分値cとを用いて、(X[t]の値)×(Y[i]の値)+(Z[t+i]の値)+cを計算し、
〈1−b〉計算結果の下位1ワードの値を(t+i)番目の変数Z[t+i]に格納し、計算結果の上位1ワードの値を新たなキャリー成分値cとする
処理を、行い、
前記制御部は、
カウンタ値iがnに達すると、前記演算部に第2フェーズの処理を開始させ、
カウンタ値iがuに達するまでの間、前記演算部が第2フェーズの1ラウンド分の処理を終了する度に、カウンタ値iをインクリメントし、
前記演算部は、
カウンタ値iがuに達するまでの間、前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第2フェーズの1ラウンド分の処理として、
〈2−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第2フェーズの処理を停止し、
〈2−b〉0でない場合に(Z[t+i]の値)+cを計算し、計算結果の下位1ワードの値を変数Z[t+i]の新たな値とし、計算結果の上位1ワードの値を新たなキャリー成分値cとする
処理を、行うことを特徴とする演算装置。 - 制御部と演算部と記憶部とを有し、
前記演算部の演算ビット幅である1ワード(1ワード=bビット)よりも大きなビット幅の入力値Xと法Mとに対して、r=2b、R=rn(nは、法Mを1ワードごとに分割した際の法Mの分割数であり、n≧2)として定義されたRと、(−M−1 mod r)として定義されたMInvとを用いて、(XR−1 mod M)を計算するモンゴメリ・リダクションを行う演算装置であって、
前記制御部は、
入力値X及び法Mを、それぞれ1ワードごとに分割し、
前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割された2n個の分割値を格納するための2n個の変数X[0]〜X[2n−1]を設け、
入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(2n−1)番目の変数X[2n−1]に格納されるようにして、2n個の分割値を変数X[0]〜X[2n−1]に格納し、
前記記憶部内の所定の記憶領域を割当てて、法Mから分割されたn個の分割値を格納するためのn個の変数M[0]〜M[n−1]を設け、
法M内の最下位ビットが含まれる分割値が0番目の変数M[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数M[n−1]に格納されるようにして、n個の分割値を変数M[0]〜M[n−1]に格納し、
前記記憶部内の所定の記憶領域を割当てて、前記演算部による計算結果を格納するn個の変数Z[0]〜Z[n−1]を設け、
前記演算部は、
スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
第1フェーズの処理として、
スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、
〈1−a〉入力値Xの0番目の変数X[0]の値とMInvとを用いて、(X[0]の値)×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
〈1−b〉法Mのt番目の変数M[t]の値と、入力値Xのt番目の変数X[t]の値と、前記uとを用いて、(M[t]の値)×u+(X[t]の値)を計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[t]の新たな値とし、計算結果mの上位1ワードの値をキャリー成分値cとし、
0番目のスレッドであるスレッド0において、
〈1−c〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数X[0]の新たな値とする
処理を、行い、
前記制御部は、
カウンタ値iを1に設定し、前記演算部に第2フェーズの処理を開始させ、
カウンタ値iがnに達するまで、全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
前記演算部は、
前記制御部によりカウンタ値iがインクリメントされる度に、第2フェーズの1ラウンド分の処理として、
個々のスレッドtにおいて、
〈2−a〉入力値Xの0番目の変数X[0]の値とi番目の変数X[i]の値と、MInvとを用いて、{(X[0]の値)+(X[i]の値)}×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
〈2−b〉法Mのt番目の変数M[t]の値と、前記uと、入力値Xの(t+i)番目の変数X[t+i]の値と、スレッドtで得られたキャリー成分値cとを用いて、(M[t]の値)×u+(X[t+i]の値)+cを計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[t+i]の新たな値とし、計算結果mの上位1ワードの値を新たなキャリー成分値cとし、
0番目のスレッドであるスレッド0において、
〈2−c〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数X[0]の新たな値とする
処理を、行い、
カウンタ値iがnに達すると、スレッド0において、値0を変数X[0]の新たな値とし、
前記制御部は、
カウンタ値iがnに達すると、スレッド0において値0が変数X[0]の新たな値とされた後に、前記演算部に第3フェーズの処理を開始させ、
カウンタ値iが2nに達するか、全てのスレッドtが第3フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第3フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
前記演算部は、
カウンタ値iが2nに達するまでの間、前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第3フェーズの1ラウンド分の処理として、
〈3−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第3フェーズの処理を停止し、
〈3−b〉0でない場合に、(X[(t+i) mod 2n]の値)+cを計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[(t+i) mod 2n]の新たな値とし、計算結果mの上位1ワードの値を新たなキャリー成分値cとする
処理を、行い、
前記制御部は、
カウンタ値iが2nに達した場合、又は全てのスレッドtが第3フェーズの処理を停止した場合に、前記演算部に第4フェーズの処理を開始させ、
前記演算部は、
第4フェーズの処理として、
変数X[0]の値を変数aに格納し、
変数X[n]〜X[2n−1]の値を、それぞれ、変数X[0]〜X[n−1]に格納し、
変数aの値が0でない場合、又は変数X[n−1]〜X[0]の値を連接して得られる値が法M以上の場合に、X−Mを計算し、計算結果を変数X[0]〜X[n−1]に格納し、
変数X[0]〜X[n−1]の値を変数Z[0]〜Z[n−1]に格納することを特徴とする演算装置。 - 制御部と演算部と記憶部とを有し、
前記演算部の演算ビット幅である1ワード(1ワード=bビット)よりも大きなビット幅の入力値Xと法Mとに対して、r=2b、R=rn(nは、法Mを1ワードごとに分割した際の法Mの分割数であり、n≧2)として定義されたRと、(−M−1 mod r)として定義されたMInvとを用いて、(XR−1 mod M)を計算するモンゴメリ・リダクションを行う演算装置であって、
前記制御部は、
入力値X及び法Mを、それぞれ1ワードごとに分割し、
前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割された2n個の分割値を格納するためのv(vはnの倍数であって、v≧3n)個の変数X[0]〜X[v−1]を設け、
入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(2n−1)番目の変数X[2n−1]に格納されるようにして、2n個の分割値を変数X[0]〜X[2n−1]に格納し、
前記記憶部内の所定の記憶領域を割当てて、法Mから分割されたn個の分割値を格納するためのn個の変数M[0]〜M[n−1]を設け、
法M内の最下位ビットが含まれる分割値が0番目の変数M[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数M[n−1]に格納されるようにして、n個の分割値を変数M[0]〜M[n−1]に格納し、
前記記憶部内の所定の記憶領域を割当てて、前記演算部による計算結果を格納するn個の変数Z[0]〜Z[n−1]を設け、
前記演算部は、
スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
第1フェーズの処理として、
スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、
〈1−a〉入力値Xの0番目の変数X[0]の値とMInvとを用いて、(X[0]の値)×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
〈1−b〉法Mのt番目の変数M[t]の値と、入力値Xのt番目の変数X[t]の値と、前記uとを用いて、(M[t]の値)×u+(X[t]の値)を計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[t]の新たな値とし、計算結果mの上位1ワードの値をキャリー成分値cとし、
0番目のスレッドであるスレッド0において、
〈1−c〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数X[0]の新たな値とする
処理を、行い、
前記制御部は、
カウンタ値iを1に設定し、前記演算部に第2フェーズの処理を開始させ、
カウンタ値iがnに達するまで、全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
前記演算部は、
前記制御部によりカウンタ値iがインクリメントされる度に、第2フェーズの1ラウンド分の処理として、
個々のスレッドtにおいて、
〈2−a〉入力値Xの0番目の変数X[0]の値とi番目の変数X[i]の値と、MInvとを用いて、{(X[0]の値)+(X[i]の値)}×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
〈2−b〉法Mのt番目の変数M[t]の値と、前記uと、入力値Xの(t+i)番目の変数X[t+i]の値と、スレッドtで得られたキャリー成分値cとを用いて、(M[t]の値)×u+(X[t+i]の値)+cを計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[t+i]の新たな値とし、計算結果mの上位1ワードの値を新たなキャリー成分値cとし、
0番目のスレッドであるスレッド0において、
〈2−c〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数X[0]の新たな値とする
処理を、行い、
カウンタ値iがnに達すると、スレッド0において、値0を変数X[0]の新たな値とし、
前記制御部は、
カウンタ値iがnに達すると、スレッド0において値0が変数X[0]の新たな値とされた後に、前記演算部に第3フェーズの処理を開始させ、
カウンタ値iが2nに達するか、全てのスレッドtが第3フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第3フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
前記演算部は、
カウンタ値iが2nに達するまでの間、前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第3フェーズの1ラウンド分の処理として、
〈3−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第3フェーズの処理を停止し、
〈3−b〉0でない場合に、(X[t+i]の値)+cを計算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数X[t+i]の新たな値とし、計算結果mの上位1ワードの値を新たなキャリー成分値cとする
処理を、行い、
前記制御部は、
カウンタ値iが2nに達した場合、又は全てのスレッドtが第3フェーズの処理を停止した場合に、前記演算部に第4フェーズの処理を開始させ、
前記演算部は、
第4フェーズの処理として、
変数X[2n]の値を変数aに格納し、
変数X[n]〜X[2n−1]の値を、それぞれ、変数X[0]〜X[n−1]に格納し、
変数aの値が0でない場合、又は変数X[n−1]〜X[0]の値を連接して得られる値が法M以上の場合に、X−Mを計算し、計算結果を変数X[0]〜X[n−1]に格納し、
変数X[0]〜X[n−1]の値を変数Z[0]〜Z[n−1]に格納することを特徴とする演算装置。 - 制御部と演算部と記憶部とを有し、
それぞれのビット幅が共通しており、それぞれのビット幅が前記演算部の演算ビット幅である1ワード(1ワード=bビット)よりも大きい入力値Xと入力値Yと法Mとに対して、r=2b、R=rn(nは、法Mを1ワードごとに分割した際の法Mの分割数であり、n≧2)として定義されたRと、(−M−1 mod r)として定義されたMInvとを用いて、(XYR−1 mod M)を計算するモンゴメリ乗算を行う演算装置であって、
前記制御部は、
入力値X、入力値Y及び法Mを、それぞれ1ワードごとに分割し、
前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割されたn個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを設け、
入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納し、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納し、
前記記憶部内の所定の記憶領域を割当てて、法Mから分割されたn個の分割値を格納するためのn個の変数M[0]〜M[n−1]を設け、
法M内の最下位ビットが含まれる分割値が0番目の変数M[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数M[n−1]に格納されるようにして、n個の分割値を変数M[0]〜M[n−1]に格納し、
前記記憶部内の所定の記憶領域を割当てて、前記演算部による計算結果を格納する2n個の変数Z[0]〜Z[2n−1]を設け、
前記演算部は、
スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
第1フェーズの処理として、
スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、
〈1−a〉入力値Xの0番目の変数X[0]の値と、入力値Yの0番目の変数Y[0]の値と、MInvとを用いて、(X[0]の値)×(Y[0]の値)×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
〈1−b〉法Mのt番目の変数M[t]の値と前記uとを用いて、(M[t]の値)×uを計算し、2ワードの計算結果をumとし、
〈1−c〉入力値Xの0番目の変数X[0]の値と入力値Yのt番目の変数Y[t]の値とを用いて、(X[0]の値)×(Y[t]の値)を計算し、2ワードの計算結果をxyとし、
〈1−d〉前記umの下位1ワードと前記xyの下位1ワードとを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値をt番目の変数Z[t]に格納し、
〈1−e〉前記mの上位1ワードと前記umの上位1ワードと前記xyの上位1ワードとを加算し、2ワードの計算結果をキャリー成分値cとし、
0番目のスレッドであるスレッド0において、
〈1−f〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数Z[0]の新たな値とする
処理を、行い、
前記制御部は、
カウンタ値iを1に設定し、前記演算部に第2フェーズの処理を開始させ、
カウンタ値iがnに達するまで、全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
前記演算部は、
前記制御部によりカウンタ値iがインクリメントされる度に、第2フェーズの1ラウンド分の処理として、
個々のスレッドtにおいて、
〈2−a〉0番目の変数Z[0]とi番目の変数Z[i]と、入力値Xのi番目の変数X[i]と、入力値Yの0番目の変数Y[0]と、MInvとを用いて、{(Z[0]の値)+(Z[i]の値)+(X[i]の値)×(Y[0]の値)}×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
〈2−b〉法Mのt番目の変数M[t]の値と前記uとを用いて、(M[t]の値)×uを計算し、2ワードの計算結果をumとし、
〈2−c〉入力値Xのi番目の変数X[i]の値と入力値Yのt番目の変数Y[t]の値とを用いて、(X[i]の値)×(Y[t]の値)を計算し、2ワードの計算結果をxyとし、
〈2−d〉前記umの下位1ワードと、前記xyの下位1ワードと、ステップtで得られたキャリー成分値cの下位1ワードと、(t+i)番目の変数Z[t+i]の値とを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を(t+i)番目の変数Z[t+i]の新たな値とし、
〈2−e〉前記mの上位1ワードと、前記umの上位1ワードと、前記xyの上位1ワードと、ステップtで得られたキャリー成分値cの上位1ワードとを加算し、2ワードの計算結果を新たなキャリー成分値cとし、
0番目のスレッドであるスレッド0において、
〈2−f〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数Z[0]の新たな値とする
処理を、行い、
カウンタ値iがnに達すると、スレッド0において、値0を変数Z[0]の新たな値とし、
前記制御部は、
カウンタ値iがnに達すると、スレッド0において値0が変数X[0]の新たな値とされた後に、前記演算部に第3フェーズの処理を開始させ、
カウンタ値iが2nに達するか、全てのスレッドtが第3フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第3フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
前記演算部は、
カウンタ値iが2nに達するまでの間、前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第3フェーズの1ラウンド分の処理として、
〈3−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第3フェーズの処理を停止し、
〈3−b〉0でない場合に、スレッドtで得られたキャリー成分値cの下位1ワードと変数Z[(t+i) mod 2n]の値とを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数Z[(t+i) mod 2n]の新たな値とし、前記mの上位1ワードとスレッドtで得られたキャリー成分値cの上位1ワードとを加算し、2ワードの計算結果を新たなキャリー成分値cとする
処理を、行い、
前記制御部は、
カウンタ値iが2nに達した場合、又は全てのスレッドtが第3フェーズの処理を停止した場合に、前記演算部に第4フェーズの処理を開始させ、
前記演算部は、
第4フェーズの処理として、
変数Z[0]の値を変数aに格納し、
変数Z[n]〜Z[2n−1]の値を、それぞれ、変数Z[0]〜Z[n−1]に格納し、
変数aの値が0でない場合、又は変数Z[n−1]〜Z[0]の値を連接して得られる値が法M以上の場合に、Z−Mを計算し、計算結果を変数Z[0]〜Z[n−1]に格納することを特徴とする演算装置。 - 制御部と演算部と記憶部とを有し、
それぞれのビット幅が共通しており、それぞれのビット幅が前記演算部の演算ビット幅である1ワード(1ワード=bビット)よりも大きい入力値Xと入力値Yと法Mとに対して、r=2b、R=rn(nは、法Mを1ワードごとに分割した際の法Mの分割数であり、n≧2)として定義されたRと、(−M−1 mod r)として定義されたMInvとを用いて、(XYR−1 mod M)を計算するモンゴメリ乗算を行う演算装置であって、
前記制御部は、
入力値X、入力値Y及び法Mを、それぞれ1ワードごとに分割し、
前記記憶部内の所定の記憶領域を割当てて、入力値Xから分割されたn個の分割値を格納するためのn個の変数X[0]〜X[n−1]と、入力値Yから分割されたn個の分割値を格納するためのn個の変数Y[0]〜Y[n−1]とを設け、
入力値X内の最下位ビットが含まれる分割値が0番目の変数X[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数X[n−1]に格納されるようにして、n個の分割値を変数X[0]〜X[n−1]に格納し、入力値Y内の最下位ビットが含まれる分割値が0番目の変数Y[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数Y[n−1]に格納されるようにして、n個の分割値を変数Y[0]〜Y[n−1]に格納し、
前記記憶部内の所定の記憶領域を割当てて、法Mから分割されたn個の分割値を格納するためのn個の変数M[0]〜M[n−1]を設け、
法M内の最下位ビットが含まれる分割値が0番目の変数M[0]に格納され、最上位ビットが含まれる分割値が(n−1)番目の変数M[n−1]に格納されるようにして、n個の分割値を変数M[0]〜M[n−1]に格納し、
前記記憶部内の所定の記憶領域を割当てて、前記演算部による計算結果を格納するv個(vはnの倍数であって、v≧3n)の変数Z[0]〜Z[v−1]を設け、
前記演算部は、
スレッド番号として「0〜n−1」が設定されているn個のスレッドを並列に実行し、
第1フェーズの処理として、
スレッド番号=t(tは「0〜n−1」のうちのいずれか)であるスレッドtにおいて、
〈1−a〉入力値Xの0番目の変数X[0]の値と、入力値Yの0番目の変数Y[0]の値と、MInvとを用いて、(X[0]の値)×(Y[0]の値)×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
〈1−b〉法Mのt番目の変数M[t]の値と前記uとを用いて、(M[t]の値)×uを計算し、2ワードの計算結果をumとし、
〈1−c〉入力値Xの0番目の変数X[0]の値と入力値Yのt番目の変数Y[t]の値とを用いて、(X[0]の値)×(Y[t]の値)を計算し、2ワードの計算結果をxyとし、
〈1−d〉前記umの下位1ワードと前記xyの下位1ワードとを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値をt番目の変数Z[t]に格納し、
〈1−e〉前記mの上位1ワードと前記umの上位1ワードと前記xyの上位1ワードとを加算し、2ワードの計算結果をキャリー成分値cとし、
0番目のスレッドであるスレッド0において、
〈1−f〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数Z[0]の新たな値とする
処理を、行い、
前記制御部は、
カウンタ値iを1に設定し、前記演算部に第2フェーズの処理を開始させ、
カウンタ値iがnに達するまで、全てのスレッドtにおいて第2フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
前記演算部は、
前記制御部によりカウンタ値iがインクリメントされる度に、第2フェーズの1ラウンド分の処理として、
個々のスレッドtにおいて、
〈2−a〉0番目の変数Z[0]とi番目の変数Z[i]と、入力値Xのi番目の変数X[i]と、入力値Yの0番目の変数Y[0]と、MInvとを用いて、{(Z[0]の値)+(Z[i]の値)+(X[i]の値)×(Y[0]の値)}×MInvを計算し、2ワードの計算結果の下位1ワードの値をuとし、
〈2−b〉法Mのt番目の変数M[t]の値と前記uとを用いて、(M[t]の値)×uを計算し、2ワードの計算結果をumとし、
〈2−c〉入力値Xのi番目の変数X[i]の値と入力値Yのt番目の変数Y[t]の値とを用いて、(X[i]の値)×(Y[t]の値)を計算し、2ワードの計算結果をxyとし、
〈2−d〉前記umの下位1ワードと、前記xyの下位1ワードと、ステップtで得られたキャリー成分値cの下位1ワードと、(t+i)番目の変数Z[t+i]の値とを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を(t+i)番目の変数Z[t+i]の新たな値とし、
〈2−e〉前記mの上位1ワードと、前記umの上位1ワードと、前記xyの上位1ワードと、ステップtで得られたキャリー成分値cの上位1ワードとを加算し、2ワードの計算結果を新たなキャリー成分値cとし、
0番目のスレッドであるスレッド0において、
〈2−f〉スレッド0で得られたキャリー成分値cの下位1ワードの値を変数Z[0]の新たな値とする
処理を、行い、
カウンタ値iがnに達すると、スレッド0において、値0を変数Z[0]の新たな値とし、
前記制御部は、
カウンタ値iがnに達すると、スレッド0において値0が変数X[0]の新たな値とされた後に、前記演算部に第3フェーズの処理を開始させ、
カウンタ値iが2nに達するか、全てのスレッドtが第3フェーズの処理を停止するまで、停止していない全てのスレッドtにおいて第3フェーズの1ラウンド分の処理が終了する度に、カウンタ値iをインクリメントし、
前記演算部は、
カウンタ値iが2nに達するまでの間、前記制御部によりカウンタ値iがインクリメントされる度に、停止していないスレッドtにおいて、第3フェーズの1ラウンド分の処理として、
〈3−a〉スレッドtで得られたキャリー成分値cが0であるか否かを判断し、キャリー成分値cが0である場合にスレッドtの第3フェーズの処理を停止し、
〈3−b〉0でない場合に、スレッドtで得られたキャリー成分値cの下位1ワードと変数Z[t+i]の値とを加算し、2ワードの計算結果をmとし、計算結果mの下位1ワードの値を変数Z[t+i]の新たな値とし、前記mの上位1ワードとスレッドtで得られたキャリー成分値cの上位1ワードとを加算し、2ワードの計算結果を新たなキャリー成分値cとする処理を、行い、
前記制御部は、
カウンタ値iが2nに達した場合、又は全てのスレッドtが第3フェーズの処理を停止した場合に、前記演算部に第4フェーズの処理を開始させ、
前記演算部は、
第4フェーズの処理として、
変数Z[2n]の値を変数aに格納し、
変数Z[n]〜Z[2n−1]の値を、それぞれ、変数Z[0]〜Z[n−1]に格納し、
変数aの値が0でない場合、又は変数Z[n−1]〜Z[0]の値を連接して得られる値が法M以上の場合に、Z−Mを計算し、計算結果を変数Z[0]〜Z[n−1]に格納することを特徴とする演算装置。 - 請求項1〜7のいずれかに記載の制御部及び演算部の処理を可能にする命令群を含んでいることを特徴とするプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012009898A JP5896756B2 (ja) | 2012-01-20 | 2012-01-20 | 演算装置及びプログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012009898A JP5896756B2 (ja) | 2012-01-20 | 2012-01-20 | 演算装置及びプログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2013148767A JP2013148767A (ja) | 2013-08-01 |
JP5896756B2 true JP5896756B2 (ja) | 2016-03-30 |
Family
ID=49046318
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2012009898A Expired - Fee Related JP5896756B2 (ja) | 2012-01-20 | 2012-01-20 | 演算装置及びプログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP5896756B2 (ja) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP5852594B2 (ja) * | 2013-01-15 | 2016-02-03 | 日本電信電話株式会社 | 多倍長整数演算装置、多倍長整数演算方法、プログラム |
-
2012
- 2012-01-20 JP JP2012009898A patent/JP5896756B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JP2013148767A (ja) | 2013-08-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4870932B2 (ja) | 多重精度を支援する拡張型モンゴメリモジュラ掛け算器 | |
CN112199707B (zh) | 一种同态加密中的数据处理方法、装置以及设备 | |
JP3605181B2 (ja) | 掛け算累算命令を使用したデータ処理 | |
US11169778B2 (en) | Converting floating point numbers to reduce the precision | |
JP7096828B2 (ja) | 入力オペランド値を処理するための装置及び方法 | |
Seo et al. | Efficient arithmetic on ARM‐NEON and its application for high‐speed RSA implementation | |
JP7292297B2 (ja) | 確率的丸めロジック | |
Chung et al. | Asymmetric squaring formulae | |
JP2021507348A (ja) | ベクトル・キャリー付き加算命令 | |
Zheng et al. | Exploiting the floating-point computing power of GPUs for RSA | |
EP3200068B1 (en) | Parallel computing method and terminal | |
CN114095149A (zh) | 信息加密方法、装置、设备及存储介质 | |
Scharfglass et al. | Breaking weak 1024-bit RSA keys with CUDA | |
Edamatsu et al. | Acceleration of large integer multiplication with intel avx-512 instructions | |
JP5896756B2 (ja) | 演算装置及びプログラム | |
Bradbury et al. | Fast quantum-safe cryptography on IBM Z | |
US20250106022A1 (en) | Multi-lane cryptographic engine and operations thereof | |
Seo et al. | Consecutive operand-caching method for multiprecision multiplication, revisited | |
Keliris et al. | Investigating large integer arithmetic on Intel Xeon Phi SIMD extensions | |
RU2595906C1 (ru) | Устройство для вычисления функций | |
Arnold | An improved DNA-sticker addition algorithm and its application to logarithmic arithmetic | |
TW457452B (en) | Methods and apparatus for performing fast multiplication operations in bit-serial processors | |
CN103389965A (zh) | 一种实现sm2密码体制的大整数求乘逆方法 | |
US20120259907A1 (en) | Pipelined divide circuit for small operand sizes | |
Liu et al. | GMP implementation on CUDA–A backward compatible design with performance tuning |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20141106 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20150528 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20150623 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20150820 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20160202 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20160301 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 5896756 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
LAPS | Cancellation because of no payment of annual fees |