IBMのx10チュートリアルをやる
tl;dr
IBMのx10言語という、並列計算に向いた言語がある。言語仕様の詳細は省くが、scalaライクにオブジェクト指向で書ける言語の割に、MPIほど面倒なことを書かなくてもネイティブなC/C++のコードを吐いてくれるので速度が出るというありがたい言語である。
このチュートリアルをやってみた時に戸惑ったことの備忘録。なお、バージョンアップによる記法の変動が割と大きいので注意されたし。以下の環境で動作を確認。
x10c++ version 2.5.4
なお、見るとわかるがver2.5のチュートリアルはなく、ver2.4のチュートリアルはAPGASと呼ばれるjava用のライブラリの説明しかないので、ver2.2のものを使うしかないので注意。
Sequential Monti Pi
(-1,-1),(1,1),(-1,1),(1,-1)で囲まれた空間にランダムに点を打ったとき、円周内に入った点の数から円周率を計算できるというもの。モンテカルロ法の亜種。
- args:Rail[String]
argsの後のRailは引数不要になっているので、()を外そう。
The x10.lang.Rail class also provides a similar, high-performance implementation of a one dimensional array. The expectation should be that a Array_1 and a Rail should have very similar performance characteristics, although the Array_1 has an additional wrapper object and thus may have marginally lower performance in some situations.
Arrayクラスもあるのだが、一次元配列の場合はより高速なRailを使うのがよいかもしれない。
- Place.MAX_PLACES is duplicated by Place.numPlaces()
MAX_PLACESで検索しても古いドキュメントしか出てこなくて途方に暮れてしまうのだが、Placeクラスのドキュメントを見るとnumPlaces()になっているらしい。
その他のtips
- Mismatched input 'var' expecting {'--', '|', '-', '!', '!=', '%', '&', '&&', '(', '*', ',', '.', '/', ';', '?', '[', '^', '||', '~', '+', '++', '<', '<<', '>>', '>>>', '<=', '==', '>', '>=', '..', '->', '<:', ':>', '**', '!~', '<-', '-<', '>-', '<>', '><', 'as', 'haszero', 'instanceof', 'isref'}
このエラーを見かけたら;が欠落していることを疑ったほうが良い。CやC++と同様。
- 配列の添字を()で表す
CやC++に慣れていると[]とついつい書いてしまうがエラーが出る。
- 型のキャストをas Intのようにする。
val x:Long = 4 as Long; val x:Long = 4L;
例えばLong型であれば数字リテラルの末尾にL
をつけるだけでもよい。Byte型やらShort型やらchar型やら、型はやたらめったら出てくるので場合に応じた適切なものを用いるとよい。
- staticをつけるとクラスに属するメソッドになる
これはC++やJAVAと同じですが、rubyでいうところのシングルトンメソッド・特異メソッドになります。実際にはrubyのシングルトンメソッドは外から呼べるので、public static
に対応しているといえるでしょう。staticにするだけでは、クラスの内部からしか呼べません。
(x10)
class Node { public static def length(){ } }
(ruby)
class Node def self.length end end
- Pair型
Pair(T first, U second)
例えば関数の返り値をペアにできる。