ナカナカピエロ おきらくごくらく

写真付きで日記や趣味を書くならgooブログ

JavaがHPC分野で使われない理由

2020-09-18 15:34:31 | 日記
JavaがHPC分野で使われない理由

JavaがHPC分野で使われない理由は多次元配列のメモリ構造にある。

ここでは簡単に2次元配列を考えてみよう。

Javaの場合、指定行の要素分の配列が列数分あり、それぞれの行配列のアドレスを指す配列がさらに別にあり、

要素にたどり着くのに、二段階のアドレス参照の手続きを踏む。

C言語であれば、指定行の要素分の配列の後に連続して次の列の行の配列が、と連続的にメモリを確保するため、

要素にたどり着くために、一発のアドレス参照(i*N+j)*sizeof(type)で簡単にアクセスできる。

C++もCに同じ。Fortranは列と行の並び方がC/C++と逆だが、やはり連続的にメモリを確保するため要素のアクセス

は一発のアドレス参照で済む。

Pythonは配列(行列)の扱いをNumpyに任せて、Cで実装しているからJavaよりマシである。

Juliaはどうだか調べていない。

他にも理由はあるが、これはかなり痛い仕様である。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Linux番外編 逆アセンブルしてみよう

2020-09-18 13:38:00 | 日記
Linux番外編 逆アセンブルしてみよう

プログラムというものは最終的にはアセンブルコードまたは疑似アセンブルコード(バイトコード)で動作する。

よりプログラムの挙動を正確に捉えようとするならば、逆アセンブルして調べるのが一番確実である。

ここではLinux番外編として、逆アセンブルツールについて書いてみようと思う。

●Linuxのロードモジュール(or オブジェクトファイル or 共用ライブラリ)

  $ objdump -d <該当モジュール>

  gdbで見たい時にはサブコマンド"disas"で見れる。

●Javaのバイトコードを観たい

  $ javap -c <クラスファイル>

●Pythonの疑似コード

  >>> import dis
  >>> dis.dis(<関数名>)

●Julia

  julia> @code_native 関数名(実引数値,・・・)

とりあえず、これだけ知っておけばいいのかな。。。皆、低レベルのコードを毛嫌いする傾向があるけど、

ここまで読めると楽しくなるんだけどな。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Linux小話 ulimitコマンド

2020-09-18 12:17:24 | 日記
Linux小話 ulimitコマンド

随分前の話である。

某大学に収めたスパコンを各大学にリモート課金で貸し出していた。

そのスパコンはもちろん自社製でハードからOS、C/C++/Fortranコンパイラも自社で提供していた。

で、九州の某大学でリモート課金で使用していたC++プログラムがを異常終了するという

クレームが入って調査した。

某大学からは調査のためとお断りをして全ソースコードをもらい、こちらでビルドして動作確認したが

再現しなかった。ということで上長(当時主任)とペーペーの私とで現地入り。

まず大学の研究室の一画を借りて、デバッグ用の端末の配線から始まり、再現確認。

確かに再現した。何度か試しているうちに上司がはっと頭を項垂れて気が付いた。

stack overflowを起こしていたのだ。

某大学ではリモート課金で貸し出しているマシンリソースとして、stack sizeは1KBytesしか与えて

いなかったのだ。ユーザ毎のリソースは、"ulimit -a"コマンドで調べられるし、サイズも変えられる。

詳しくは、manコマンドにて見てほしい。

しかし某大学のマシン設定では、ulimitコマンドでstack sizeを変更するにはroot(スーパーユーザ)権限

が必要だった。

仕様がなかったので、私はsetrlimitシステムコールでstack sizeを十分なサイズに変更してから、

fork-execして顧客のプログラムを起動するlauncherプログラムをC言語で書いた。

見事に顧客のプログラムは異常終了することなく、プログラムが動作したのである。

まあ、今から思うとOSのセキュリティホールだと思うのだが、蓋を開けてみれば単純な問題であった。

リモート課金を提供している某大学には秘密でlauncherプログラムの使用をお願いしますと釘を打った。

その後、九州の某大学からは、個別にスパコンのコンパクトモデルを購入して頂いた。

まあ、親身に対応すると売り上げに貢献できるときもあるのだなと思った。

九州土産を週末、実家に帰って、父と母に上げた。父が亡くなったのはその一週間後だった。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Linux小話 malloc/free - メモリ管理アルゴリズム今昔

2020-09-17 15:33:47 | 
Linux小話 malloc/free - メモリ管理アルゴリズム今昔

Linux malloc/freeの内部のメモリ管理アルゴリズムにて良い資料を見つけたので紹介しておく。

しかも動画付き。

ぶっちゃけ、懐かしい部分があったので、ちょっと昔を振り返って話しておく。

今は昔。私がスパコン用のC++コンパイラを開発していたときの話。

自社製のスパコンに自社製のOS、そしてC/C++/Fortranコンパイラとデバッガ、etc...

All in Oneで何から何まで自社開発で作れていた古き良き時代だった。

とある大学で、C++コードのnew/delete演算子が遅いとクレームが入って、調べるまでもなく

malloc/freeが遅いとOS部門に文句を付けた。

なぜならnew/deleteは単なるmalloc/freeのwrapper関数だったからだ。

しかしOS部門は納得せず、C++コンパイラ部隊のせいだと言い張った。

そこでOSからmalloc/freeのソースコードを入手して、Linux上にポーティングしてLinuxの

malloc/freeとの性能測定を行い、明らかに自社OSが自作したmalloc/freeが遅いエビデンスを

採り、かつ研究所から論文を入手して、Linuxのmalloc/freeのメカニズムをOSに叩きつけた。

決定的に違ったのは、Linuxのmalloc/freeは8バイト毎に1024バイト(?)まで小さいサイズの

freeリストで内部管理していて、小さいサイズのmallocがfreeリストから簡単に見つけられる

のに対して、自社OSは、2冪バイト毎のサイズでfreeリストを管理していたため、目的のサイズ

のメモリをfreeリストから見つけ出すのにかなりの時間を要していたのである。

結局、OS部隊に納得してもらい、自社OSのmalloc/freeアルゴリズムを改善した結果、

大幅な性能改善が見られたのは言うまでもなかった。顧客受けも良かったらしい。

最後はOS部隊から感謝の言葉をもらった。

ここいら辺の話も下記の紹介資料では説明してくれている。

懐かしいなあ。

・資料
Glibc malloc internal #dynamicmemoryallocation #glibc
https://www.slideshare.net/kosaki55tea/glibc-malloc @SlideShareより

・動画

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Linux小話 mprotectシステムコールについて

2020-09-17 10:13:39 | 日記
Linux小話 mprotectシステムコールについて

実行モジュールのファイルフォーマット形式の話から始めよう。

現在のLinuxの実行モジュールファイルフォーマットはELF(Executable and Linkable Format)と呼ばれる。

古くはAT&Tが開発したUnix System VのCOFF(Common Object File Format)がベースとなっている。

詳細はWikipediaにも記載されているので調べてみてほしいのだが、要はロード時にテキスト(コードエリア)と

データと、etc..をメモリ展開するときに分解できるようにセクションに分かれている。

当然コードエリアはread onlyで実行可能。データエリアはread-writeできて実行不可能なメモリ属性が付けられる。

このようなメモリ保護の設定を行うシステムコールとして、mprotectがある。

仕様についてはWebで調べてもらうとして、ここではmprotectの効用を2つ例を挙げておく。

● gdb(デバッガ)のhardware watchpoint機能

例えばプログラムにバグがあって、それがある特定のアドレス参照時に異常終了するケースを考えよう。

参照時にはもうそのアドレスのデータは壊れていて、誰が壊したか分からない。

かような時にgdbのwatchpoint機能を使用すると、そのアドレスが参照したときbreakできるようになる。

この仕掛けはgdbが該当アドレスのメモリ領域にガードを掛けて、トラップするようにmprotectでメモリを保護する。

そしてトラップしたシグナルをgdbがハンドリングしてbreakするのである。

例えば、C言語で配列外参照を発生させた場合、Javaのように例外は発生せず、そのままスルーしてしまう。

そして別のメモリを壊したまま動作して、後で請われたメモリを参照したときにプログラムが狂って異常終了する場合がある。

かような時に常に同じメモリアドレスで配列外参照を引き起こしていれば、このメモリ領域にwatchpointを仕掛ければ良い。

mprotectを使うとハードウェア的にトラップが掛かるため、このwatchpointはhardware watchpointと呼ばれる。

●Java JIT(Just In Time)コンパイラ

Javaプログラムはコンパイルされたバイトコード(.classファイル)を仮想マシン上で動作させるが、これだと性能が

上がらないため、良く使用されるメソッドは機械語にコンパイルされて、直接実行される。

当然、コンパイル後のコードは動的にとったメモリ(mallocを使って)上の領域に格納される。

これだと実行不可能な保護が掛けられているため、直接実行できない。

よってJITコンパイラは出力した機械語のメモリ領域をmprotectシステムコールを使って実行権限を与える。

以上、二つのmprotectの使用例を挙げた。他にもオブジェクトパッチを当てるときにも使用される。

ある意味、裏技的なテクニックで使用される便利なシステムコールなのである。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ナカナカピエロのうわのそら(情報幾何学)

2020-09-16 11:34:39 | 日記
ナカナカピエロのうわのそら(情報幾何学)

甘利俊一先生が開拓した情報幾何学をマスターしたいと昔から思っているが、未だに理解できていない。

昔、私は情報幾何学の特に双対の概念について以下の走り書きを書いた。

ルジャンドル変換と情報幾何

今回は、以下の資料を元にもうちょっと分かりやすい走り書きを書いてみることとした。

情報幾何で見る機械学習 赤穂昭太郎

まず情報幾何において与えられたサンプルデータを統計モデル上で考えたい時に滑らかな統計モデルを考え、

そこに誤差を加味してもっともモデルにフィットする点を見出すために統計モデルへの垂線(射影とも言う)を考える

ことは重要である。

ここでは簡単に正規分布を考えると平均値であるμと標準偏差であるσの二次元平面を考えると、

この二つのパラメタで正規分布族の全てが決まるわけだが、ここで垂線を下すとして当然正規分布の統計モデル

は平坦(e)でもなければ、真っ直ぐ(m)と言っても実はぐにゃぐにゃ曲がっている。(eとmは双対である)

そんな世界の中で、我々は得られたデータと統計モデルを結びつけることができるのだろうかという疑問が生じる。

そこで甘利俊一先生は微分幾何の概念をベースに情報の中に幾何的構造を入れて多様体として扱うという試みをされた。

例えば、μとσの2次元平面内の距離を考えても、なだらかな正規分布間の距離と尖った正規分布間の距離は

ユークリッド空間とは異なり現実的に意味が異なってくる。(上記資料のP.11/75参照)

そうすると当然空間は曲がっており、微分幾何的構造を入れざるを得ない状況となる。

通常のリーマン幾何では各座標近傍に接空間を考えて曲率(リーマン計量)を考え、各座標の接続(レビ・チビタ接続)を

考える。それでは情報幾何ではどうか。

情報幾何ではこの曲率がフィッシャー情報行列になるということである。(この辺りから理解が怪しくなる。)

何故、フィッシャー情報行列が活用されるかはクラメール・ラオの不等式から分散の下限がフィッシャー情報行列の平均値

の逆数よりも大きくなることが証明されており、これにより逆数が大きいほど、きめの粗い統計モデルになることが分かる

からである。

次の話として接続を考える。通常の微分幾何であれば、局所座標近傍の基底ベクトルの曲率を加味して接続を考える。

こうやって向きを変えずに接続を繰り返してできたアウトラインを測地線と呼ぶ。

通常の微分幾何ではレビ・チビタ接続を考えるが、情報幾何ではα接続という新たな接続方法を導入する。

多分、平坦(e)と真っ直ぐ(m)とは双対ではありながらも情報幾何では互いに別々な概念であり、自由度を高くして

考えたかったのだろう。(個人的見解。)

ここでα接続の特別な場合として、「指数分布族」と「混合分布族」とがあり、それぞれ(e-平坦、e-接続)、(m-平坦、m-接続)

と呼ぶ。(このe-mは双対空間となっており、ルジャンドル変換で繋がっている?)

つまるところ2つの間で相互に座標変換ができるということ。

ここで改めて、情報幾何における平坦と接続の概念が整備されたところで、統計モデル間のダイバージェンスが定義できる。

機械学習の分野で出てくるEMアルゴリズムなどの幾何学的解釈にこれら情報幾何の概念が役立つ。

とりあえずここまで。間違え等あれば一報くれたし。

完全理解したいなあっと思っている以下の本。
新版 情報幾何学の新展開 (SGCライブラリ) 甘利 俊一
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

onna - 267

2020-09-15 15:42:09 | 日記
onna - 267
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

サディスト

2020-09-15 13:54:31 | 
サディスト

普段はニヒルに構えて
自尊心をなじられると
烈火のごとく怒り
殴る蹴るの暴行を加え
極上の令嬢を隣に添えて
優雅に街を闊歩するも
洋間の一室で
奴隷のごとく地を這わせて
ウイスキーのグラスを
舌の上で転がしながら
時折、激しく鞭を振るって
女の白い肌が紅潮して
赤い内出血の跡を見ては
喜び、さらに激しく鞭を振るう
危険薬物を吸引しては
高らかに笑い
ネクタイを緩めながら
女を縛り上げる
やり手の実業家で
流暢で熱い騙りで周りを惹きこみ
敵とあらば容赦なく蹴落とす男

彼はかような男なのです
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

onna - 266

2020-09-15 08:50:54 | 日記
onna - 266
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

虚数を暴け

2020-09-14 17:39:02 | 
虚数を暴け

我々の実在は
我々が可視できる世界
である

しかしそれは
物事の半分も見ていない

我々の実在は
我々には不可視な世界から
出でた可視の側面に過ぎない

我々はその不可視な実在を
想像力と論理力で朧気ながらに
暴き出すのだ
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする