fortran66のブログ

fortran について書きます。

【メモ帳】メモリー階層レイテンシー

intel parallel universe magazine vol.37 p.7 より

software.intel.com

f:id:fortran66:20190904004641p:plain
latency

1nsを1秒に換算すると、おおよそ

 階層 換算時間
レジスタ   0.1秒
キャッシュ 1秒
DRAM   1分
不揮発メモリ  1時間
SSD 1日
HDD       100日
テープ    3年

分散メモリのネットワーク通信はSSD HDD 位、加速装置とのやり取りは不揮発メモリ位でしょうか?

レイテンシ、バンド幅

水道でいえば、

・レイテンシは蛇口をひねってから水が出るまでの時間。

・バンド幅は水がドバドバ出るか、ちょろちょろ出るかの量。

手洗いや台所では、ちょろちょろでもいいが蛇口をひねったらすぐ水が出て欲しい。(レイテンシ小が〇)風呂場やプールに水をためるなら、最初は中々水が出なくてもドバドバ出ればそれでいい。(バンド幅大が〇)

補足 

Introduction to High Performance Computing for Scientists and Engineers(2010)

f:id:fortran66:20190904220157p:plain
latency & bandwidth

Introduction to High Performance Computing for Scientists and Engineers (Chapman & Hall/CRC Computational Science)

Introduction to High Performance Computing for Scientists and Engineers (Chapman & Hall/CRC Computational Science)

【寝言】【メモ帳】樗蒲の発明は老子

樗蒲(ちょほ)

博物志に『樗蒲は天竺より出づ、老子此に本づきて今の雙陸を造る』とか。

ja.wikipedia.org

芸文類聚』巻74に引く馬融「樗蒲賦」では老子が西域に行ったときに暇潰しに樗蒲を遊んだとしている[1]。『太平御覧』巻754に引く西晋の張華『博物志』では、老子が西域に行って発明したとする[2]。これらの伝説は樗蒲が外国起源であることを示すのかもしれない。

[2] 『太平御覧』巻754・工芸部11・摴蒱「『博物志』曰:老子入胡日、作摴蒱焉。」

雙陸(すごろく)

バックギャモン  zh.wikipedia.org

老子印度人説

博物志は魏晋南北朝西晋の書。この頃は仏教も来て天竺と通じているし、老子化胡説が後漢の頃にはあるらしいので新しくもない。

もっと古い時代の老子印度人説材料はないものか。屈原の楚辞の中の解釈不能の所を、インド系の言葉の音とすると意味が通づるとかいう話を耳にしたことがありますがw

あいまいみー  コミック 1-7巻セット

あいまいみー コミック 1-7巻セット

不思議なソメラさんトラ~不思議なソメラちゃんOST~

不思議なソメラさんトラ~不思議なソメラちゃんOST~

【寝言】ハドソン研究所創始者ハーマン・カーンと電子計算機

Herman Kahn

昨年のマイク・ペンス米副大統領の反中宣言会場に選ばれ、日高義樹でおなじみの米ワシントンのハドソン研究所ですが、最近ではトランプ大統領と不仲で辞職したマクマスター補佐官が、なぜか新設の日本部長になったとニュースに出ていました。また安倍首相が 2013 年に 外国人として初めて創始者の名を採ったハーマン・カーン賞を受賞していたようです。

fortran66.hatenablog.com

www.nikkei.com

www.zaikei.co.jp

【ハドソン研究所とは?】  ハドソン研究所は、米国ワシントンにある保守派のシンクタンクであり、1961年にハーマン・カーン氏によって設立された。  カーン氏はもともと、大学で物理学を専攻し、卒業後ランド・コーポレーションで物理学者として道を歩んだ後、核戦略について執筆。その後、日本を含めた地政学を研究するようになった。  独立した翌年には、「日本は経済超大国になる」と予測している。1970年には『超大国日本の挑戦』を執筆し、「日本は、技術力と金融力をもった経済大国になることに疑う余地はなく、世界的軍事力と政治的影響力を勝ち取る可能性が高い」と述べている。  他方、カーン氏は日本の良き旧友でもあったと海外紙は報じている。死去する1983年まで池田元首相ら歴代首相と付き合いがあったようだ。同研究所は今も日本と同様の交流を続けている。

そんなハドソン研究所ですが、元々物理学者だったハーマン・カーンランド研究所にいた時に、フォン・ノイマン核兵器による相互確証破壊(Mutual Assured Destruction, MAD)を実現するものとしての『多数の水素爆弾をコンピューターで管理し、いざという時にすべてを起爆して地球上を放射性降下物で覆う』終末兵器を発案して物議をかもしたようです。この終末兵器は、キューブリックの映画『博士の異常な愛情』にも出てきます。

ここまでがまくら

ランド研究所時代のハーマン・カーンの書いたモンテカルロ法による多重積分の記事が、アンソニー・ラルストン、ハーバード・S・ウィルフ共編「電子計算機のための数学的方法I」に出ています。この本の原著は 1960 年出版で 、1950 年代に急速に進んだ digital computer (計数型計算機)での数値計算についてまとめた本です。訳書のあとがきによると IBM の Scientific Subroutine Package (SSP) の理論的背景をまとめたもので、日本のコンピュータ演算ルーチンの種本だそうです。

カーンの記事では、ランド研究所発行の乱数表の話の後、乱数発生装置を使わずとも計算機では決定論的数列で生成される疑似乱数で十分だとして、二進法コンピュータ用の疑似乱数の生成法として線形合同法の Rn+1=K Rn mod 2n が与えられていて、係数 K は5の奇数べきがいいと言っています。

[追記R3.2.6] ランド研究所発行の乱数は熱雑音の電流によるようです。 fortran66.hatenablog.com

カーンは元々中性子が専門のようですが、そういえば私も昔 FORTRAN入門の演習で原子炉壁で散乱される中性子を乱数で計算して吸収係数だか平均自由行程だかを求めさせられたような気がしますw 疑似乱数の式の mod 2n がどっから湧いてきたものかと不思議に思いましたが、よくよく考えれば本来は単に符号なし整数で桁あふれを無視するというだけですね。  

Mathematical Methods for Digital Computers: v. 1

Mathematical Methods for Digital Computers: v. 1

  • 作者:RALSTON MATHEMA
  • 発売日: 1960/12/01
  • メディア: ハードカバー

ja.wikipedia.org

アメリカ陸軍始まって以来のIQの高さを持っているというのは有名だが、実際はあらゆるIQテストの傾向を分析して対策を練った上でIQテストに臨んだことで好成績を残したというものだった。ちなみにカーンは30分で全問解答して一旦会場から退出したものの、後になって1問ミスに気付いて会場に戻った。

『熱核戦争論』での過激な主張もさることながら、演説好きで肥満体という一種独特なキャラクターのインパクトは強烈であったためか、さまざまなフィクション作品でモデルになっている。

映画『博士の異常な愛情』 主人公のドクター・ストレンジラブのモデルとなり、カーンが自ら同作品を監督したスタンリー・キューブリック著作権料を要求したというオマケまでついた。

アニメ「ガンダムシリーズ」 登場人物のハマーン・カーン(女性)は、カーンのアナグラムに由来している。

fortran66.hatenablog.com

その他

ソースを失念しましたが、たしか IBM の科学サブルーチンライブラリ SSP は出来が良くなくて、そのせいでサード・パーティー数値計算ライブラリ開発を促し、IMSL ライブラリなどが成立したと読んだ記憶があります。真偽不明ですが。

【メモ帳】薔薇という名のコンパイラ族

ROSE compiler infrastructure

rosecompiler.org

ROSE is an open source compiler infrastructure to build source-to-source program transformation and analysis tools for large-scale C (C89 and C98), C++ (C++98 and C++11), UPC, Fortran (77/95/2003), OpenMP, Java, Python and PHP applications.

Lawrence Livermore National Laboratory (LLNL) 謹製のコンパイラ・ツール族のようです。 LFortran と関係していると思われます。

fortran66.hatenablog.com

f:id:fortran66:20190827015706j:plain
http://bungaku.cocolog-nifty.com/barazoku/2018/08/post-da90.html

【メモ帳】精度毎のルーチンで楽したい その2

submodule を使った場合(案)

まだ何がいいかよく分かりません。

Modern Fortran Explained: Incorporating Fortran 2018 (Numerical Mathematics and Scientific Computation)

Modern Fortran Explained: Incorporating Fortran 2018 (Numerical Mathematics and Scientific Computation)

fortran

julia 言語のプログラムが軽めに見えるので、真似して end xxxx の xxxx を省略してみました。個人的には省略しない派閥なんですがw Fortran も軽くみえていいかも?

intel fortran v.19.1 beta だと end interface の interface と module procedure の module とそれに対応する interface の module が省略できません。この辺、文法理解があいまいですw

submodule の中身などは共通なので、非標準ですが include 文を使えばソースを単一化できると思います。

輸入時の名前の付け替えを用いていますが、輸出時に名前を付けかえれれば、もうちょっとすっきりします。Fortran では出来なかったと思うけど、記憶が曖昧です。あとで文法をもう一度チェックしたいです。

module mods
    integer, parameter :: ks = kind(1.0e0)
    integer, parameter, private :: kn = ks
    interface 
        module real(kn) function f(x) result(res)
            import
            real(kn), intent(in) :: x
        end  
    end interface   
end  
    
submodule (mods) mod
contains
    module procedure f
        res = x             
    end  
end 

    
module modd
    integer, parameter :: kd = kind(1.0d0)
    integer, parameter, private :: kn = kd
    interface 
        module real(kn) function f(x) result(res)
            import
            real(kn), intent(in) :: x
        end
    end interface   
end  

submodule (modd) mod 
contains
    module procedure f
        res = x             
    end  
end  
    
    
module modq
    integer, parameter :: kq = kind(1.0q0)
    integer, parameter, private :: kn = kq
    interface 
        module real(kn) function f(x) result(res)
            import 
            real(kn), intent(in) :: x
        end 
    end interface   
end 

submodule (modq) mod 
contains
    module procedure f
        res = x             
    end 
end
    
      
module mod
    use mods, only : fun_s => f
    use modd, only : fun_d => f
    use modq, only : fun_q => f
    implicit none
    interface fun
        procedure :: fun_s, fun_d, fun_q
    end interface
end 
       
        
program test
    use mod
    implicit none
    print *, fun(2.0e0)
    print *, fun(2.0d0)
    print *, fun(2.0q0)
end 

実行結果

   2.000000
   2.00000000000000
   2.00000000000000000000000000000000

【メモ帳】精度毎のルーチンで楽したい

generic の代用

薬局でもジェネリックを勧められても拒否するし、Fortran 文法でもジェネリクス導入を拒否しますw

そもそも単精度では精度を保つため、積の結果だけ倍精度使うとか、完全に同じソースではすまないことがあります。

とはいえ、ジェネリクスのように同じコードの繰り返しを1回で済ませられなくても、実装部は同じ内容のコピペを繰り返して、インターフェース前後だけ最小限いじってすませられないか、少し考えてみました。

submodule を使うと、定義の向きなどが素直でいいのですが、名前の重複に工夫が必要です。ここでは module のみで考えてみることにします。

 Fortran

単精度・倍精度・四倍精度の module を三つそれぞれに対して用意しますが、モジュール名と定数以外は共通とします。それらを親モジュールに集めて、名前のダブりを use 文で回避して、総称名にします。

Modern Fortran Explained: Incorporating Fortran 2018 (Numerical Mathematics and Scientific Computation)

Modern Fortran Explained: Incorporating Fortran 2018 (Numerical Mathematics and Scientific Computation)

 module mod00
    implicit none
    integer, parameter :: ks = kind(1.0e0)
    integer, parameter :: kd = kind(1.0d0)
    integer, parameter :: kq = kind(1.0q0)
end module mod00

module mods
    use mod00
    implicit none
    integer, parameter :: kn = ks
contains
    real(kn) function fun(x) result(res)
        real(kn), intent(in):: x
        res=x
    end  
end  

module modd
    use mod00
    implicit none
    integer, parameter :: kn = kd
contains
    real(kn) function fun(x) result(res)
       real(kn), intent(in):: x
       res=x
    end    
end  

module modq
    use mod00
    implicit none
    integer, parameter :: kn = kq
contains
    real(kn) function fun(x) result(res)
       real(kn), intent(in):: x
       res=x
    end    
end  


module mod
    use mods, only: fun_s=>fun 
    use modd, only: fun_d=>fun
    use modq, only: fun_q=>fun
    interface fun
        procedure :: fun_s, fun_d, fun_q
    end interface
end module mod

    
program test
    use mod
    implicit none
    print *, fun(1.0e0)
    print *, fun(1.0d0)
    print *, fun(1.0q0)
end program

実行結果

   1.000000
   1.00000000000000
   1.00000000000000000000000000000000

【メモ帳】gfortran-9 gif

binder gfortran-9 animation gif

gfortran-9 は forall(integer::i ...) のローカル変数には対応していないが、findloc には対応していてやや進歩。

定数に関して、コンパイラオプションが必要

%fcflags:-fno-range-check

f66blog.github.io

ディレクトリ example 下

  • example/gif87a.ipynb
  • example/AnimationGif.ipynb

f:id:fortran66:20190821031937p:plain
gfortran9 gif