parallella触ろう #01

気付いたら前回から何か月たってんのよみたいになるけど、第一回はーじまーるよー(遅

前回のおさらい

Hello worldのサンプルを読みました
しかしこれ気になるところが数点あるので、まずは気になるところをどうにかしていきましょう。みたいな話。たぶん。

前回の気になりポイント

さて、前回の気になりポイントはいくつかありましたが、トピックスとしては次のようなものだと思います

  • e_openの謎
  • 終了通知これでいいのか

それぞれについて確認していきましょう

e_openの謎

e_openは、EpiphanyのeCoreに起動を促すものであるという話でした
では、そのAPIはどのようになっているものなのかを確認しましょう

e_openのAPIはこんな感じになっています。
第1引数は、前回説明した通り、e_openで起動したeCoreの情報を格納する構造体です。
第2~第5引数が、”いくつのeCoreを起動するのか”を指定するものとなっています

EpiphanyはeCoreがタイル型に並んでおり、それぞれがメッシュネットワークに接続されているアーキテクチャとなっています。
図で言うと次のような感じ

第2、3引数のrow, colは、切り出す開始位置を示します
たとえば、row = 0, col = 0だとすると、一番左上。row = 1, col = 0だとすると、最上段2番目のeCoreを指します
続いての第4、第5引数については、それぞれの行・列内でいくつ確保するか、という意味です
なので、row = 0, col = 0, rows = 1, cols = 1だとすると、左上の1個のみということです
row = 0, col = 0, rows = 4, cols = 4とするとすべての領域をカバーするというわけですね
ほかにも、こんなのとか

こんなのとかもできます

さて、Epiphanyでは、この切り出したeCoreのまとまりを、「ワークグループ」と呼称します。
OpenCLを参考にしてる感がある名称ですね。
では、先ほどのAPIを踏まえて、Hello worldのサンプルを改めて眺めてみると…

あー、なんていうのこの気持ち。
このサンプルでやっていることは、言葉にすると次のようになります
『Epiphany 4×4のタイルの中からランダムに選んだ1つのeCoreを起動して、Hello worldを出力。出力終わったらeCoreを終了。それをSeqLen回繰り返す』
まぁ、それはそれでいいんですけど、どっちかっていうとそうじゃないよね、やりたいHello worldって…というような気持ちになります
俺のやりたいのは違う!
『Epiphanyの16のeCoreを起動して、そのすべてからHello worldを出力』したいのだ!
という想いを胸に秘めて、色々と書き換えることにします

終了通知これでいいのか

さて、まぁ起動に不満がありますが、さらにその次を確認しましょう。
起動を確認したら、次、eCoreが終了したことをどのように受け取ればいいのでしょうか
答えは、そんな方法はありません
現在のSDKの実装と、ついでにEpiphanyとのつながり方だと、残念なことにARM側に割り込みを入れることは困難です。
…なので、今はひとまず、eCoreが持つローカルなメモリのあるアドレスに終了フラグを立て、それをARM側で任意の個数読めるまでポーリングする方向で行きます

まとめ

というわけで、ParallellaのHello worldで疑問だった点を修正したソースコードというのが
https://bitbucket.org/fixstars/blog/src/fbdeb9976ebe2e161f7ae5687c21b6c9e76bf659/parallella-hello_world/

になります。
次回はもう少し別のことやってみたいと思います。たとえば…えー、なんだろう

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です