中田真秀(なかたまほ)のブログ

研究について、日常について、その他。

MPACKプロジェクトは Microsoft Research Core 6に採択された。

2010-04-07 11:34:46 | 日記
MPACKプロジェクト
Microsoft research core 6に採択された。その時の顛末は、http://accc.riken.jp/maho/mscore6.htmlに書いてみた。
Microsoftからすると、微々たる金であろうが、そこから認められたというのがうれしい。ただ、人を雇えるほどではなく、ハードウェアや学会参加費用に消えるのだと思われる。従って爆発的には進まないであろう。

MPACK 0.6.5のリリースは遅れている

2010-04-07 08:23:12 | 日記
多倍長精度BLAS, LAPACKであるMPACKの新バージョンである0.6.5の公開が遅れている。三月末に公開する予定だった(約束したのは藤澤先生だけである、申し訳ないです)が、果たせなかった。その理由は三つある。一つ目。現在、MPFR対応を急いでいるが、これにてこずっているからである。特に複素数のC++ラッパーはMPCを用い、新規に書き直している最中である。なぜMPFR対応か。これはGMPは計算の正確さより速度に主眼が置かれていて丸めモードなどに一切の制御ができないことによる。またMPC対応も時間がかかっている。複素数対応を少し甘く見ていたようである。二つ目。品質保証プログラムの書き換え。MPFRはBLAS/LAPACKと比較、GMP, QDはMPFRと比較、することでより信頼性の高い品質保証をしたいと考えている。こうすると大幅な書き換えが必要になる。三つめ。論文を書いている。遅筆である。

このようなライブラリ作成は人間の力全てが試されている気がする。並列計算のリクエスト、LAPACKルーチンの充実など、問い合わせが多い。

IBM AIX, Apple MacOSX(PPC) の128 ビット擬似四倍精度について

2010-04-07 07:38:25 | 日記
IBM AIX やMacOSX PowerPC版は128 ビットの長倍精度データ型をサポートしておりたとえばlong doubleは有効桁が32桁ほどある。が、これは本物の「四倍精度」ではない。double-doubleと呼ばれたりすることもある。時々Power970はハードウェアで四倍精度をサポートする、などと事実誤認がある。クリアにするため、これについて少し解説する。

倍精度(IEEE754-1984ではdouble precision, IEEE754-2008ではbinary64)は有効桁が16桁ほどであり、計算の精度が足りない場合が出てくる。このときは所謂四倍精度などを用いたりするが、驚くべきことに、所謂四倍精度に相当するものがIEEE754で定義されたことは2008年までなく、IEEE754-2008になって、初めてbinary128というフォーマットが定義され、所謂四倍精度が規格化された。cf.
draft 1.2.9, 27 January 2007 (最終パブリックドラフト)へのリンク
。従って、我々が何となく四倍精度と呼んでいたものは、全て自分で勝手に名乗っていただけで、何か標準的な規格は無かった。問題のある表現である。

AIXは、128-bit long double data type (128 ビットの長倍精度データ型)をサポートしており、時折四倍精度とよぶ人もいる。これは、Knuth, Dekkerらによる、浮動小数点に於ける二つの数の和および積の厳密な誤差分離の定理(正しい名称を知りません...)を用いた、64bitのdouble precisionを二つ並べたものである(cf. Baily, Hida et al; QD lib.)。従って、double-doubleのアプローチと呼ばれたりすることもある。確かにコンパイラのマニュアルには、「1 つの 128 ビットの長倍精度数は、1 組の順序付きの 64 ビット倍精度数で構成されます。順序付きペアの最初のメンバーにはその数の上位部分が入り、2 番目のメンバーには下位部分が入っています。長倍精度の数量の値は、2 つの 64 ビット数の合計です」と書かれている。

このアプローチはdoubleの演算ですべて事足りるので、多倍長精度計算を行わず、手軽にソフトウェアだけで実現可能である。そしてソフトウェアエミュレーションよりは高速だと考えられている。しかし、いまいちサポートされている環境は少ない。知る限り、RS6000系のgccやAppleのMacOSX PowerPC版のみでこれをサポートしている。おそらくAIX上での互換性を保つため、前者はサポートし、後者はgccをサポートしたのでそれに引きずられるようにサポートしたのであろう。

ソースコードを見てみよう。前者について、darwin-ldouble.cがわかりやすく、
後者について、libmのソースコードが入手できる。
見れば解るとおり、陽にdouble-doubleのアプローチでの擬似四倍精度であることがわかる。尚、Intel Macには、long doubleについて、そのようなソースコードの痕跡はない。高速かはどうかは計測していない。

もし、他プラットフォームで使いたいのであれば、HidaらのQDライブラリを使うべきであろう。我がMPACKも使っている。規格にしてしまえ、というのは有るのかもしれないが、これについては多くが否定的である。また今度述べることにする。