[Go to BBS]
All articles in a thread
SubjectSAD 64bit化の可能性
Article No643
Date: 2008/09/17(Wed) 01:59:36
ContributorAkio Morita
以下の議論は、可能性の議論であって実装をするという話ではありませんので、
コードをくれと言われても何も出ません

Fortran2008規格には、I/Oの encodingという概念が導入されているようで、
gfortran 4.4では UTF-8 encodingのサポートが実装されました。これに伴い、
内部encodingとしてUCS-4(kind = 4なcharacter)が使用可能になっています。

従って、
 * 8倍精度浮動小数点(kind = 32 real)
 * 128bit整数(kind = 16 integer)
 * UCS-4文字(kind = 4 character)
を組み合わせると、real = 2*integer = 8*characterの関係を維持したまま、
LP128環境をサポート可能になるはずです。
問題は、8倍精度浮動小数点なんてものをハードウェアで実装した計算機が手軽に入手できない点にあります。
文字列格納の効率は1/4になりますが、その代わりにI18Nな文字列操作を自然に実装可能になります。

SunのSPARCやIBMのPOWERでは、IEEE754rのドラフトベースで4倍精度浮動小数点を
ハードウェアで実装しているらしいので、次のような実装で 64bitネイティブなSADを構築できる
可能性があります。

1. 8倍精度realを 4倍精度complexに置き換える
   複素数絡みのコードは、実数絡みのコードに比べれば局所的であり
   複素数は実数の自然な拡張になっている(可換体という意味で)
   * 4倍精度複素浮動小数点(kind = 16 complex)
   * 128bit整数(kind = 16 integer)
   * UCS-4文字(kind = 4 character)
   問題: INF * 1などで内部的に複素数として計算するとINF+NAN Iになってしまう点など...

2. コンパイラに手を入れてUCS-2文字(kind = 2 character)をサポートする
   * 4倍精度浮動小数点(kind = 16 real)
   * 64bit整数(kind = 8 integer)
   * UCS-2文字(kind = 2 character)
   問題: UCS-2では、Unicodeの全ての文字を使おうとするとサロゲートペアが必要になり
           可変長encodingになってしまう

注意点: 新しい規格を使う話なので、Fortran77/90/77/2003コンパイラな
           環境を切り捨てる必要があります。

SubjectRe: SAD 64bit化の可能性
Article No644
Date: 2008/09/17(Wed) 11:16:59
ContributorK. Oide
コードをください。

SubjectRe^2: SAD 64bit化の可能性
Article No645
Date: 2008/09/17(Wed) 16:22:10
ContributorAkio Morita
> コードをください。
>
第0案(8倍精度浮動小数点を使う)だと Fortran的には
real*8 -> real(32)
integer*4 -> integer(16)
integer*2 -> integer(8)
integer*1 -> integer(4)
character -> character(4)
へsedか何かで機械的に置き換えて OPEN分にで encoding=UTF-8を指定すれば、
良いと思うので、コードの変更はほとんどいらないはずです(第0案の場合は)

ただし、8倍精度浮動小数点とか128bit整数をサポートしたFortran2008コンパイラが
必須なので、試験環境が手元に無いために動くという確証はありません

文字列処理関連でFortran以外の Cライブラリ(Tcl/Tkを含む)を呼び出す際には
文字列のencodingを変換する必要があります(wcstombsかiconv辺りで手当てする必要あり)
現在使っている文字列渡しを伴う APIは unibyte character stringか
multibyte character stringを仮定している
# Network I/O、Tkinter、System[]などなど

内部データ構造が語長非依存に設計されていれば、こんな苦労は無いはずなんだけど...