サイトポリシー サイトマップ
2017 年 04 月 24 日

プログラミング環境

 

利用可能コンパイラ

スーパーコンピュータシステムでは2016年06月現在、コンパイラとして以下の3種が利用可能です。

パッケージ名バージョン対応言語インストール位置ドキュメントURL(サイト外)
Intel Composer XE Linux 16.0.1(XE2016) C、C++、Fortran77,
90,IV,2003,2008
/opt/intel/xe_2016/ URL
PGI Accelerator CDK Cluster
Development Kit
16.4 C、C++、C99、Fortran77
90,95,2003、HPF
/opt/pgi/linux86-64/current/ URL
Gnu Compiler(OSS) 4.8.5 C、C++、Objective-C、Fortran77,
90,2003,2008、Java、Ada
/usr/local/bin/ URL

2016年06月以前の環境も利用可能です。

パッケージ名バージョン対応言語インストール位置ドキュメントURL(サイト外)
Intel Composer XE Linux 14.0.0(XE2013) C、C++、Fortran77,90,2008     /opt/intel/composer_xe_2013_3_sp1.0.080/ URL
PGI Accelerator CDK Cluster
Development Kit
13.9 C、C++、Fortran77,2003、HPF   /opt/pgi/linux86-64/2013/ URL
Gnu Compiler(OSS) 4.8.1 C、C++、Fortran77,90 /usr/local/pkg/gcc/4.8.1/ URL

Intel コンパイラの使用方法

64ビット環境版、バージョン16.0.1が、ユーザのデフォルト環境で使用可能となっています。各言語コンパイラのコマンド名称は以下の 様です。

言語コンパイルコマンド
C icc
C++ icpc
Fortran  ifort

利用可能な主なオプションは以下のようです。詳細については、開発元ドキュメントサイト にあるドキュメントをご参照下さい。

コンパイルオプション意味
-fast プログラムの全体の速度を最大限にします。
-O1 サイズを考慮した最適化を行います。オブジェクトのサイズを増やす傾向のある最適化を省略します。
-O2 最適化します。(デフォルト設定)ベクトル化と実行速度を改善する多くの最適化を実行します
-O3 -O2の最適化に加えて、スカラー置換、ループアンロール、分岐を除去するコード反復、効率的にキャッシュを使用する ループブロッキング、データ・プリフェッチ機能など、強力なループ最適化およびメモリアクセス最適化を行います。
-openmp OpenMP指示行がある場合、その指示によるマルチスレッドコードが生成されます。スタックのサイズを増やさなければならないことがあります。
-xtarget targetで指定された命令セットをサポートするインテルプロセッサ向けの専用コードを生成します。実行ファイルは、 インテル製以外のプロセッサ、またはより低い命令セットをサポートするインテルプロセッサでは実行できません。targetの値は次の通りです(命令セットのレベルの 高い順):
AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2
-xHost コンパイルを行うホストプロセッサ上で利用可能な最上位の命令セットを利用したコードを生成します。
-ipo インライン展開およびその他のプロシージャ間の最適化を複数のソースファイルに対して行います。オプションの n引数には、コンパイル時に生成するオブジェクトファイルの最大数を指定します。デフォルトのnは0です。条件によってはコンパイル時間とコードサイズが大幅に 増大する場合があります。

尚、Intelコンパイラについてデバッグが完了していて正しい結果が得られていることが確認できているプログラムに対して推奨するオプションは、-fastです。 -fastは以下の最適化オプションに展開されます。

    -ipo -O3 -no-prec-div -static -xHost
    

最適化によっては、コンパイルできない、結果が異なる。プログラムが異常終了する。ということも発生することがありますので、まず最適化無しでコンパイルして、動作 と結果を確認した上で、段階的に最適化レベルを上げて確認をお願いします。

また注意頂きたいのは、Fat、Medium計算ノードと、Thin計算ノードの対応する拡張命令のレベルが違うことです。(ハードウェア構成参照) 上記の-xHostオプションは自動的に対応する拡張命令レベルを判別して最適化を実行してくれますが、Thinノード上で最適化コンパイルされたコードは、Fat/Medium計算ノード 上で以下のようなメッセージが出力されて動作しない場合があります。

Fatal Error: This program was not built to run in your system.
Please verify that both the operating system and the processor support Intel(R) AVX.
  

この為、ログインノード(Thin計算ノード)上で、Fat/Medium計算ノード用に最適化コンパイルを行いたい場合については、御手数ですが、-xHostオプションを指定せずに -xsse4.2と明示的に拡張命令セットを指定してコンパイルしてください。

Intel コンパイラのアップデートについて

Intel コンパイラ 14.0.0→16.0.1 によりアップデート前にシェアードライブラリでコンパイルされた実行ファイルは新しいバージョンの環境で再度コンパイルされるか、旧バージョンのライブラリ環境で実行する必要があります。スタティックライブラリでコンパイルされた場合にはそのまま実行可能です。
1) 新しいバージョン環境で利用される場合新しいバージョンのコンパイラ で再コンパイルしてください。新しいバージョンは標準パスに設定されています。
コンパイル・実行例)
% icc test.c -o test
% ./test
2) 旧バージョン環境で利用される場合
    標準パスにインストールされておりませんので環境変数を指定して実行する必要があります。
旧バージョン設定スクリプト)
--- bsh系 ---
source /opt/intel/composer_xe_2013_sp1.0.080/bin/compilervars.sh intel64
--- csh系 ---
source /opt/intel/composer_xe_2013_sp1.0.080/bin/compilervars.csh intel64
実行スクリプト例)
#!/bin/sh
#$ -S /bin/sh
source /opt/intel/composer_xe_2013_sp1.0.080/bin/compilervars.sh intel64 
./test

PGIコンパイラの使用方法

64ビット環境、バージョン16.4が利用可能となっています。各言語のコンパイラコマンドは以下の通りです。

言語コンパイルコマンド
C pgcc
C++ pgcpp
C99 pgcc
GNU互換C++ pgfortran,pgcc
PGI C++ pgCC,pgcpp
HPF pghpf
FORTRAN77 pgf77
FORTRAN90,95,2003 pgf90,pgf95,pgfortran 

PGIコンパイラの基本的なオプションについては、販売元サイトの以下のページをご参照ください。
PGIコンパイラオプション一覧は、こちら

また、システム内の以下のディレクトリ下に、pdfとhtml形式のマニュアルがあります。以下のようにして参照してください。(X Window環境が手元に必要です。)

  evince /opt/pgi/linux86-64/current/doc/pgi11ug.pdf
  firefox /opt/pgi/linux86-64/current/doc/index.htm
  

GCCの利用方法

GNUコンパイラの環境の各言語のコンパイラのコマンド名称は以下の通りです。

言語コンパイルコマンド
C gcc
C++ g++
FORTRAN77 g77
FORTRAN90 gfortran
Java gcj

GNU コンパイラのアップデートについて

GNU コンパイラ 4.8.1→4.8.5によりアップデート前にシェアードライラリでコンパイルされた実行ファイルは新しいバージョンの環境で再度コンパイルされるか、旧バージョンのライブラリ環境で実行する必要があります。スタティックライブラリでコンパイルされた場合にはそのまま実行可能です。
1) 新しいバージョン環境で利用される場合
    新しいgccで再コンパイルし てください。新しいバージョンは標準パスに設定されています。
コンパイル・実行例)
% gcc test.c -o test
% ./test
実行スクリプト例)
#!/bin/sh
#$ -S /bin/sh
#$ -cwd
./test
2) 旧バージョン環境で利用される場合
    標準パスにインストールされておりませんので環境変数を指定して実行する必要があります。
実行スクリプト例)
#!/bin/sh 
#$ -S /bin/sh 
export GCC_HOME=/usr/local/pkg/4.8.1 
export PATH=$GCC_HOME/bin:$PATH 
export LD_LIBRARY_PATH=$GCC_HOME/lib:$LD_LIBRARY_PATH 
./test

プログラミングツール、科学技術計算用ライブラリについて

以下の並列プログラミング環境が利用可能です。

パッケージ名バンドル製品インストール位置開発元ドキュメントサイト(URL)
Intel Cluster Studio Intel MKL、Intel IPP、Intel TBB、Intel MPI、Intel Trace Analyzer/Collector /opt/intel URL
PGI Accelerator CDK Cluster
Development Kit
PGDBG、PGPROF、ACML /opt/pgi URL

以下に、MKLの並列バージョンとのダイナミックリンクするときのコマンドライン指示例を示します。本システムのデフォルト環境では、ライブラリ、インクルードファイルへのパスは通してあります。

  ifort -lmkl_intel -lmkl_intel_thread -lmkl_core -liomp5 -lpthread
  

各ツールの詳細については、販売元のドキュメントサイトをご参照ください。

尚、GNU環境については、GSL(Gnu Scientific Library)をオープンソースソフトウェアとしてインストールしてあります(/usr/local/pkg/XXX下)。

MPI環境

MPIライブラリとしては、OpenMPI+Intel Compiler(64bit)の組み合わせと、OpenMPI+gcc(64bit)の組み合わせが現状利用可能で、OpenMPI+Intel Compilerの組み合わせがユーザ環境デフォルトになっています。 2013年11月現在システム内で利用可能なOpenMPIのバージョンは1.6.5です。 本環境下でのMPIプログラムのコンパイルには、以下のコマンドを利用してください。

言語コンパイルコマンドパス
C mpicc /usr/local/pkg/openmpi/current_icc/bin
C++ mpic++ /usr/local/pkg/openmpi/current_icc/bin
FORTRAN77 mpif77 /usr/local/pkg/openmpi/current_icc/bin
FORTRAN90 mpif90 /usr/local/pkg/openmpi/current_icc/bin

また、オープンソースのコンパイル時に、gccを利用してMPIプログラムをコンパイルしたい場合は、以下のコンパイルコマンドをご利用下さい。

言語コンパイルコマンドパス
C mpicc /usr/local/pkg/openmpi/current_gcc/bin
C++ mpic++ /usr/local/pkg/openmpi/current_gcc/bin
FORTRAN77 mpif77 /usr/local/pkg/openmpi/current_gcc/bin
FORTRAN90 mpif90 /usr/local/pkg/openmpi/current_gcc/bin

また、これらのコマンドの起動時にIntelコンパイラの最適化オプションが利用可能です。その際、現状OpenMPIのライブラリはシェアードライブラリ でしか用意していない為、最後のオブジェクトファイルを作成する為のリンケージの際に、最適化オプション"-fast"が指定されている場合、mpiライブラリが リンケージできずエラーが出力されます。

  ld: cannot find -lmpi_cxx
  

これは、-fastオプションが最適化オプションとして以下のオプションに展開され、そのオプションの中に静的リンケージを指定する"static"オプションが含まれる為です。

-ipo -O3 -no-prec-div -static -xHost
  

このエラーを防ぐために、mpiライブラリをリンクして実行オブジェクトを作成するリンケージの段階では、-fastを指定せず、-fastから展開されるオプション から-staticを抜いた以下のオプションを以下のように指定して下さい。

-ipo -O3 -no-prec-div -xHost
  

OpenMPIのアップデートについて

OpenMPI 1.4.4→1.6.5によりアップデート前にシェアードライブラリでコンパイルされた実行ファイルは新しいバージョンのopenmpi環境で再度コンパイルされるか、旧バージョンのmpirunで実行する必要があります。スタティックライブラリでコンパイルされた場合にはそのまま実行可能です。
1) 新しいバージョン環境で利用される場合
    新しいmpicc で再コンパイルしてください。新しいバージョンは標準パスに設定されています。
コンパイル・実行例)
% mpicc mpitest.c -o mpitest
% mpirun -machinefile machines -np 24 mpitest
実行スクリプト例)
#!/bin/sh
#$ -S /bin/sh
#$ -pe mpi 2-24
#$ -cwd
/usr/local/bin/mpirun -np $NSLOTS -machinefile $TMPDIR/machines \
./mpitest
2) 旧バージョン環境で利用される場合
    標準パスにインストールされておりませんので環境変数を指定して実行する必要があります。
実行スクリプト例)
#!/bin/sh
#$ -S /bin/sh
#$ -pe mpi 2-24
export MPI_HOME=/usr/local/pkg/openmpi/1.4.4_icc
export PATH=$MPI_HOME/bin:$PATH
export LD_LIBRARY_PATH=$MPI_HOME/lib:$LD_LIBRARY_PATH
$MPI_HOME/bin/mpirun -np $NSLOTS -machinefile $TMPDIR/machines \
./mpitest

プロファイラ環境について

プロファイラとしては、PGI CDKに同梱されているPGPROFが利用可能です。プロファイラはログインノード上で実行されると思いますが、この時 pgprofはJavaアプリケーションである為、Java環境についてで記載した注意事項が関係します。そちらをご一読頂いて環境設定の 上、pgprofを起動してください。またPGPROFの機能詳細についてはURLをご参照ください。 また、PGPROFについてGUI環境(X-Window System)を利用される場合は、ユーザのお手元に、X-Window Server環境をご用意下さい。

GPGPUプログラミング環境について

Thin計算ノードの一部(month_gpu.q、debug.qの一部、login.qの一部)ではGPGPUが利用可能となっています。 利用可能なGPGPUは、Tesla M2090で、GPU搭載ノード1台に1基搭載されています。 GPU利用可能ノードでは、CUDAドライバ、CUDA ツールキットが利用可能となっています。

コンポーネントバージョン
CUDAドライバ 7070
CUDA ツールキット 7.5,V7.5.17

GPGPUのプログラムを開発したい場合は、ログインノードの一部にGPGPUを搭載したノードが割り当ててありますので "-l gpu"オプションを指定して、ログインノードにqloginしてください。

[username]@gw ~]$ qlogin -l gpu
Your job 7345711 ("QLOGIN") has been submitted
waiting for interactive job to be scheduled ...
Your interactive job 7345711 has been successfully scheduled.
Establishing /home/geadmin/UGER/utilbin/lx-amd64/qlogin_wrapper session to host t140i ...
Warning: Permanently added '[t140i]:58350,[172.19.0.140]:58350' (RSA) to the list of known hosts.
username@t140i's password:
Last login: Mon Jun 25 11:32:46 2012 from t351i
  

ログインできたら、pgaccelinfoコマンドを利用して、各種環境の状態を確認してください。

[username@t140 ~]$pgaccelinfo
CUDA Driver Version:           7050
NVRM version:                  NVIDIA UNIX x86_64 Kernel Module  352.39  Fri Aug 14 18:09:10 PDT 2015

Device Number:                 0
Device Name:                   Tesla M2090
Device Revision Number:        2.0
Global Memory Size:            5636554752
Number of Multiprocessors:     16
Number of Cores:               512
Concurrent Copy and Execution: Yes
Total Constant Memory:         65536
Total Shared Memory per Block: 49152
Registers per Block:           32768
Warp Size:                     32
Maximum Threads per Block:     1024
Maximum Block Dimensions:      1024, 1024, 64
Maximum Grid Dimensions:       65535 x 65535 x 65535
Maximum Memory Pitch:          2147483647B
Texture Alignment:             512B
Clock Rate:                    1301 MHz
Execution Timeout:             No
Integrated Device:             No
Can Map Host Memory:           Yes
Compute Mode:                  default
Concurrent Kernels:            Yes
ECC Enabled:                   Yes
Memory Clock Rate:             1848 MHz
Memory Bus Width:              384 bits
L2 Cache Size:                 786432 bytes
Max Threads Per SMP:           1536
Async Engines:                 2
Unified Addressing:            Yes
Managed Memory:                No
PGI Compiler Option:           -ta=tesla:cc20
  

また、nvccが利用可能か、バージョンがいくつかを確認してください。

[username@t140 ~]$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2015 NVIDIA Corporation
Built on Tue_Aug_11_14:27:32_CDT_2015
Cuda compilation tools, release 7.5, V7.5.17
  

nvccを利用したコンパイルは、例えば、以下のようにします。

  [username@t140 ~]$nvcc -o sample1 sample1.cu
  

実行モジュールができたら、テスト的に動作させてみます。(この時あくまでログインノード上ではテスト的に 動作させるのみに留めてください。本格的な計算は計算ノード上でおこなってください。)

  [username@t140 ~]$ sample1
  

動作するようでしたら、ジョブスクリプトを作成して、month_gpuキューに投入します。ジョブスクリプト名を 仮にsample.shとします。

  [username@t140 ~]$qsub -l month -l gpu sample.sh
  

以上のようです。その詳細については、CUDAのマニュアル、PGIコンパイラのマニュアル等を参照してください。

NVIDIAのドキュメントサイトは こちら

PGIの販売元のGPU関連情報サイトは こちら

GPUが搭載されているノード上では、以下のディレクトリ化にpdfまたは、html形式のマニュアルが配置されています。これも適宜参照してください。

  firefox /usr/local/cuda/doc/index.tml
  evince /usr/local/cuda/doc/対象のpdfファイル名
  

Java環境について

JDKは複数バージョンがインストールされています。インストールディレクトリは

    /usr/local/pkg/java
    

です。その下に複数バージョンのJDKがインストールされており、そのうちの1バージョンに パスを通してあります。現状では、JDK1.8系列の最新バージョンにデフォルトのパスを通してありますので 、その他のバージョンのものをご利用になりたい方は自分の環境でそちらにパスを通してください。

ここでJava使用時の注意点を申し上げます。Javaは起動時にノードの物理メモリ搭載量を見て 起動時のヒープ領域サイズを決定する為、UGEによって規定された仮想記憶上限4GBよりも大きなサイズのヒープ 領域を取得しようとし、そのままではJavaが起動できません。Javaを使用されたい方は、javaコマンドのオプション"-Xmx"で最大ヒープサイ ズを明示してJavaを起動してください。

[username@t266 ~]$ java -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
[username@t266 ~]$ java -Xmx512m -version

java version "1.8.0_45"

Java(TM) SE Runtime Environment (build 1.8.0_45-b14)

Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

大きなヒープを必要とする場合は、あらかじめqlogin時に"-l s_vmem","-l mem_req"で使用するメモリ量を指定してください。

[username@gw ~]$ qlogin -l s_vmem=8G -l mem_req=8G

(※中略※)
[username@t266 ~]$ java -version

java version "1.8.0_45"

Java(TM) SE Runtime Environment (build 1.8.0_45-b14)

Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

スクリプト言語環境について

以下のスクリプト言語が利用可能になっています。バージョンについては適宜アップデートされますのでご了承ください。

言語バージョンインストールパス
ruby 2.3.0 /usr/local/bin/ruby
python 2.7.2/3.5.1 /usr/local/bin/python
perl 5.22.1 /usr/local/pkg/perl

スクリプト言語のモジュールについて

各スクリプト言語のモジュールについて、基本的なものについては適宜整備していっておりますが、全体は多岐にわたり検証、維持が困難な面もある為、ユーザからのご要望にすべてお答えすることは難しいと考えております。本サイトではユーザ個別にユーザ自身がホームディレクトリ上にモジュールをインストールすることは特に禁止しておりませんので、ユーザ側でそのような対応が可能なものについてはユーザ個別にご対応頂けるようご協力をお願い致します。


環境設定方法について

R(統計解析ソフト)

Rは2.14.1と3.1.1が利用可能です。

3.1.1の場合は、以下の環境設定をすることで利用可能となります。

$ export PATH=/usr/local/pkg/R/3.1.1_icc_mkl_shared/bin:$PATH

1) コマンド利用

$ R

R version 2.14.1 (2011-12-22)
Copyright (C) 2011 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-unknown-linux-gnu (64-bit)

Rは、自由なソフトウェアであり、「完全に無保証」です。
一定の条件に従えば、自由にこれを再配布することができます。
配布条件の詳細に関しては、'license()'あるいは'licence()'と入力してください。

Rは多くの貢献者による共同プロジェクトです。
詳しくは'contributors()'と入力してください。
また、RやRのパッケージを出版物で引用する際の形式については
'citation()'と入力してください。

'demo()'と入力すればデモをみることができます。
'help()'とすればオンラインヘルプが出ます。
'help.start()'でHTMLブラウザによるヘルプがみられます。
'q()'と入力すればRを終了します。

>


2) UGE利用

UGEよりRを利用する場合、Rスクリプトとジョブスクリプトを用意していただき、UGEに投入します。

UGE利用方法については、基本的利用方法を参照してください。

Rスクリプト
$ cat script.R
print("Hello")
$

ショブスクリプト
$ cat sub.sh
#!/bin/bash
#$ -S /bin/sh
#$ -cwd 
Rscript --slave --vanilla script.R
$

実行(スクリプト投入)
$ qsub sub.sh


 

 

python(スクリプト言語)

python2.7.2とpython3.5.1をインストールしています。

python2.7.2を利用する場合は、python、  python3.5.1を利用する場合はpython3で利用可能です。

$ python
Python 2.7.2 (default, Feb 12 2014, 18:09:10)
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

$ python3
Python 3.5.1 (default, Mar  9 2016, 15:02:45)
[GCC 4.8.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

 

各自の環境を用意する方法は、いろいろあります。その中の1つの設定方法を記述します。

1) モジュールインストール

以下コマンドで各自のホームディレクトリの~/.localにインストールされます。

 python2.7の場合
$ pip2.7 install scikit-learn --user

python3.5の場合
$ pip3.5 install scikit-learn --user

2) 複数環境設定

virtualenv コマンドを利用してpython環境を作成し、その環境にモジュールをインストールできます。

$ virtualenv --system-site-packages pytest
$ source pytest/bin/activate
(pytest)$ pip install -U scikit-learn
(pytest)$ deactivate
$

 

Caffe(Deep Learning)

利用可能な環境はPhase2システム(gw2.ddbj.nig.ac.jp)側のGPUノードにあります。

利用時には、以下環境設定をお願いします。

$ export PATH=/usr/local/pkg/caffe/1.0.0/bin:$PATH
$ export INCLUDE=/usr/local/pkg/caffe/1.0.0/include:$INCLUDE
$ export PKG_CONFIG_PATH=/usr/local/pkg/caffe/1.0.0/lib/pkgconfig:$PKG_CONFIG_PATH
$ export LIBRARY_PATH=/usr/local/pkg/caffe/1.0.0/lib:/usr/local/pkg/caffe/1.0.0/lib64:$LIBRARY_PATH
$ export LD_LIBRARY_PATH=/usr/local/pkg/caffe/1.0.0/lib:/usr/local/pkg/caffe/1.0.0/lib64:$LD_LIBRARY_PATH

 

Chainer(Deep Learning)

Chainerは標準環境にインストールしていませんので、各ユーザのローカル環境へインストールして利用する形となります。

以下手順で~/.local/lib/python3.5/site-packages/chainerにインストール出来ます。

$ qlogin -l gpu
$ pip3 install chainer-cuda-deps --user

GPUノードにはGPGPUが1個搭載されているので、サンプル(train_mnist.py)を動作させるときのパラメタは"-g 0"となります。

$ nvidia-smi --list-gpus
GPU 0: Tesla K20m (UUID: GPU-061f6b78-3f56-ae44-16cc-16895f545f86)
$ python3 train_mnist3.py -g 0
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy validation/main/accuracy
1           0.190004    0.0889905             0.943217 0.9709
2           0.0738993   0.0812382             0.976799 0.9755
3           0.0479154   0.0790933             0.984582 0.9741
4           0.0345604   0.067594              0.988898 0.9794
5           0.0283923   0.0861393             0.990382 0.9755
6           0.0240985   0.0825888             0.992732 0.9804
7           0.0218557   0.0714303             0.992948 0.9834
8           0.0186435   0.0862484             0.993915 0.9774
9           0.0161368   0.0780722             0.994849 0.9829
10          0.0138898   0.0901754             0.995598 0.9802
11          0.0161946   0.0804797             0.994866 0.9831
12          0.0124647   0.0995004             0.995765 0.9814
13          0.0117104   0.0854573             0.996549 0.982
14          0.00952666  0.0847075             0.997299 0.9841
15          0.0139888   0.100827              0.995899 0.9812
16          0.0101461   0.0860459             0.996999 0.9832
17          0.010066    0.111853              0.996849 0.9816
18          0.00916897  0.0932611             0.997099 0.9829
19          0.0104644   0.0973971             0.996599 0.9829
20          0.00732917  0.0974605             0.997882 0.9825
$