fortran66のブログ

fortran について書きます。

整数の集合和

二つの整数配列があって、それぞれを集合の要素だと思って、二つの配列の集合和をとることを考える。

それは二つの配列を単純に合併したあとで quick sort の微妙な変形で、重複する要素を省きながら sort する関数に掛けることで実現できる。

実行結果

再帰そのままのへっぽこ quick sort モドキなので遅いが、まぁ百万と百万で 1~2 秒くらい?

空集合空集合の和
空集合と集合の和
・集合と集合の和
・乱数で生成した大きな集合(百万要素)同士の和の重ならない率

 1 2 3
 1 2 3 4 5 7
 86.49100 %
続行するには何かキーを押してください . . .

ソース・プログラム

Fortran 2003 / 手抜きなのでスタックサイズを大きくしないとまずい。

    module m_sub
      implicit none
    contains
      function iset_union(ia, ib)
        integer, allocatable :: iset_union(:)
        integer, intent(in) :: ia(:), ib(:)
        iset_union = pseud_qsort([ia, ib]) 
      end function iset_union
      
      recursive function pseud_qsort(m) result(iret) ! deletes duplicate element
        integer, intent(in) :: m(:)
        integer, allocatable :: iret(:) 
        iret = [integer::]
        if (size(m) < 1) return 
        iret = [pseud_qsort(pack(m, m < m(1))), m(1), pseud_qsort(pack(m, m > m(1)))]
      end function pseud_qsort  
    end module m_sub
    
    program test
      use m_sub
      implicit none
      integer, parameter :: n = 10**6
      integer, allocatable :: ia(:), ib(:)
      real   , allocatable :: tmp(:)
      print *, iset_union([integer::], [integer::])
      print *, iset_union([integer::], [3,2,1])
      print *, iset_union([1,3,5,7], [4,3,2,1])
      
      allocate(ia(n), ib(n), tmp(n))
      call random_number(tmp)
      ia = n * tmp
      call random_number(tmp)
      ib = n * tmp
      print *, size(iset_union(ia, ib)) * 100.0 / n, '%'
    end program test

Bash on Windows 上の gfortran + F03GL + FreeGlut による OpenGL

Bash on Windows

Windows10 では、ベータですが Ubuntu 系の bash が使えるようになっています。次の大型 update で正式になるという噂です。

その bash 上では gfortran が簡単にインストールできます。sudo apt-get install gfortran

ここで OpenGL で作画することに挑戦してみます。

X-window

まず windows 側に Xming X Server for Windows という X Server ソフトをインストールします。 無料版は10年前のバイナリを使うようです。Xming-mesa-6-9-0-31-setup.exe (mesa がついている方が OpenGL に良いようですが、詳しくはわかりません。フォントもインストールする必要があるのかよくわかりません。)

export DISPLAY=localhost:0.0 (~/.bashrc に付加)

bash on Windows

fortran66.hatenablog.com 手順メモ 1.sudo apt-get install freeglut3-dev
2. f03gl.tgz download
3.f03gl 展開 
  必要ファイル取り出し i. OpenGL_gl.f90, ii. OpenGL_glu.f90, iii. OpenGL_Freeglut.f90 ⇒ OpenGL_glut.f90 に改名。
4.コンパイル gfortran OpenGL_gl.f90 OpenGL_glu.f90 OpenGL_glut.f90 nnnn.f90 -lGL -lGLU -lglut -o nnnn.x

FreeGlut

Bash on Windows 側に FreeGLUT をインストールします。sudo spt-get install freeglut3-dev

f03gl.tgz

f03gl.tgz を windows 側でダウンロードして、bash on windows 側からアクセスできるディレクトリにコピーし、展開します。

Compile & Go

FreeGLUT に対応したファイルを選択する必要があります。

20170327024227

PathScale 社苦境へ

HPC wire によりますと、Fortran コンパイラメーカの PathScale 社がいよいよ苦境に陥って身売りに入った模様です。
www.hpcwire.com

かつて AMD が元気があったころに、AMD 向けの Fortran/C/C++ コンパイラを作るといって張り切っていましたが、その後 AMD の苦境とともに目立たなくなっておりました。

記事によると、その後 MIPS に向かい、Cray に拾われ、ARM にも手を出していたようです。

同じ x86 系の Fortran/C/C++ コンパイラメーカの PGI が、CUDA コンパイラの開発から、Nvidia に子会社化されたのと、運命が分かれました。

ARM で頑張れば一発逆転があるかもしれません。


ハードウェア乱数生成

古典講読

アンソニー・ラルストン、ハーバード・S・ウィルフ共編「電子計算機のための数学的方法II」中の第12章乱数生成の脚注によると、Ferranti Mark 1 には雑音二極管による乱数生成装置が付いていたそうである。

Ferranti Mark 1 - Wikipedia

f:id:fortran66:20170319022033j:plain

maxloc, minloc の mask = .false. の時の挙動

いつの間にか、intel fortran での maxloc, minloc の mask 全部不成立時のデフォでの挙動が変わっていてちょっと焦りました。

intel fortran v.17 のヘルプより引用

If array has size zero, or every element of mask has the value .FALSE., the value of the result is controlled by compiler option assume [no]old_maxminloc, which can set the value of the result to either 1 or 0.

コンパイラ・オプションで/assume:noold_maxminlocとすると、以下のプログラムで 0 が返されます。

    program test
      implicit none
      integer :: ia(5), i
      do i = 1, 5
        ia(i) = i
      end do
      print *, maxloc(ia, mask = .false.)
    end program test


規格によると、Fortran2003 では 0 を返すことになっていますが、それ以前は処理系依存だった模様です。

しばらくぶりにリコンパイルして実行したら結果が変わったので困惑しました。

Damian Rouson による co-array に関する講演

Scientific Software Design: The Object-Oriented Way の著者 Damian Rouson の Fortran 2015 に関する講演が youtube にあっぷされていました。主に coarray の機能の内 Fortran 2015 で採用される予定のものについて解説しています。
insidehpc.com


Tutorial: Towards Exascale Computing with Fortran 2015

ロ氏は sourcery institute (魔法研究所)という厨二全開の名前のグループを率いて、open-coarray その他の開発、Fortan 啓蒙活動等を行っているようです。Unix 系の人々は昔から魔法使いとかが大好き過ぎてドン引きです。同サイトには、Fortran がらみのソフト一式を束ねた Virtual Box の Lightweigt UbuntuVM を配布しております。面白そうな試みなので、覗いてみてください。
www.sourceryinstitute.org

https://dl.dropboxusercontent.com/u/7038972/SourceryLubuntu/Overview.pdf