Pythonインタプリタの多倍長整数演算の改良

Python インタプリタの多倍長整数演算の改良
IISEC 堀川 清司, 小崎 俊二, 松尾 和人
2009 年 3 月 7 日
2009 日本応用数理学会研究部会連合発表会 JANT
1
研究背景
Python:高水準プログラミング言語、オープンソースのインタプリタ
Python の特徴:
• 簡潔な文法 → プログラミングが容易
• インタプリタは C 言語で開発 → 様々なプラットフォームに対応
⇒ 幅広く利用
• 標準で多倍長整数演算に対応
→ 処理速度が不十分
Python インタプリタの多倍長整数演算を高速化
⇒ 数論アルゴリズム計算・セキュリティ技術実装の高速化
2009 日本応用数理学会研究部会連合発表会 JANT
2
Python における多倍長整数
多倍長整数に関するプログラムファイル:
• Include/longintrepr.h
– 多倍長整数の構造体定義
• Include/longobject.h
– 多倍長整数演算の C/API 関数宣言
• Objects/longobject.c
– 多倍長整数演算を行う関数記述
⇒ 多倍長整数:PyLongObject 型 (構造体) として表現
2009 日本応用数理学会研究部会連合発表会 JANT
3
Python の多倍長整数表現
B = 2SHIFT を基数とした多倍長整数の表現:
∑
s
x = (−1)
xiB i, 0 ≤ xi ≤ B − 1, s ∈ {0, 1}
0≤i<n
PyLongObject:
• ob_size (signed int 型):(−1)s · n
• ob_digit (unsigned short 型):xi, (0 ≤ ∀i < n)
16 ビットを仮定
Python → SHIFT=15
• 32bit/word を仮定 (gcc 準拠)
• 冪乗算の k-ary 法における窓幅: 5bit
2009 日本応用数理学会研究部会連合発表会 JANT
4
Python 多倍長整数演算の改良方針
• 多倍長表現桁サイズ変更:15bit → 16bit
– 桁数減少による高速化
– 15bit へのマスク処理省略による簡略化
⇒ 乗算・除算・冪乗算の高速化
2009 日本応用数理学会研究部会連合発表会 JANT
5
プログラムファイル変更部分
• Include/longintrepr.h
– 桁サイズ: SHIFT=15 → 16
• Objects/longobject.c
– マスク処理等の省略: t&(215 − 1) → t
– 冪乗算における k-ary 法の窓幅: 5bit → 4bit
– 乗算における自乗計算部分削除
• Python/marshal.c
– unsigned short 型を扱う関数の追加
→ 乗算・除算・冪乗算に対する効果を確認
2009 日本応用数理学会研究部会連合発表会 JANT
6
乗算の実行時間比較
実験結果:
32bit 環境
70
40
Python 2.5.2 Original
Python 2.5.2 Modified
Python 2.5.2 Original
Python 2.5.2 Modified
35
CPU TIME [µ sec]
60
CPU TIME [µ sec]
64bit 環境
50
40
30
20
10
30
25
20
15
10
5
0
0
0
500
1000
k [bit]
1500
Pentium 4 (2.66GHz)
gcc-4.2.1 on SUSE Linux
2000
0
500
1000
k [bit]
1500
2000
Xeon 5365 (3.00GHz)
gcc-4.2.1 on SUSE Linux
⇒ 1.5∼2 倍程度高速化
2009 日本応用数理学会研究部会連合発表会 JANT
7
除算の改良
Python:Knuth の除算アルゴリズムを利用するが、冗長な処理が多い
⇒ Knuth の除算アルゴリズムを再実装
• 32bit/word を考慮した実装
2009 日本応用数理学会研究部会連合発表会 JANT
8
除算の実行時間比較
実験結果:
32bit 環境
160
90
Python 2.5.2 Original
Python 2.5.2 Modified
140
Python 2.5.2 Original
Python 2.5.2 Modified
80
70
120
CPU TIME [µ sec]
CPU TIME [µ sec]
64bit 環境
100
80
60
40
60
50
40
30
20
20
10
0
0
0
500
1000
k [bit]
1500
2000
0
500
1000
k [bit]
1500
2000
⇒ 2 倍以上高速化
2009 日本応用数理学会研究部会連合発表会 JANT
9
法冪乗算に対する効果
多倍長整数表現桁サイズの変更
• 乗算・除算の高速化 ⇒ 法冪乗算の高速化
• k-ary 法の窓幅: 5bit → 4bit の影響
2009 日本応用数理学会研究部会連合発表会 JANT
10
法冪乗算の実行時間比較
実験結果:
32bit 環境
500
64bit 環境
300
Python 2.5.2 Original
Python 2.5.2 Modified
450
250
CPU TIME [m sec]
400
CPU TIME [m sec]
Python 2.5.2 Original
Python 2.5.2 Modified
350
300
250
200
150
100
200
150
100
50
50
0
0
0
500
1000
k [bit]
1500
2000
0
500
1000
k [bit]
1500
2000
⇒ 約 1.5∼2 倍高速化
2009 日本応用数理学会研究部会連合発表会 JANT
11
まとめ
• 多倍長整数表現の桁サイズ変更 15 → 16 ビット
• Knuth の除算アルゴリズムの効率的な実装
⇒ 乗算・除算・法冪乗算の処理速度向上
2009 日本応用数理学会研究部会連合発表会 JANT
12