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
© Copyright 2024 Paperzz