parallella触ろう #01

2015年1月22日

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

前回のおさらい

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

前回の気になりポイント

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

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

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

e_openの謎

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

#include “e-hal.h”
int e_open(e_epiphany_t *dev, unsigned row, unsigned col,
 unsigned rows, unsigned cols);

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のサンプルを改めて眺めてみると…

for (i=0; i < SeqLen; i++)
{
 char buf[ShmSize];
 row = rand() % platform.rows;
 col = rand() % platform.cols;
 coreid = (row + platform.row) * 64 + col + platform.col;
 fprintf(stderr, "%3d: Message from eCore 0x%03x (%2d,%2d): ", i, coreid, row, col);

 e_open(&dev, row, col, 1, 1);
 e_reset_group(&dev);

 if ( E_OK != e_load("e_hello_world.srec", &dev, 0, 0, E_TRUE) ) {
  fprintf(stderr, "Failed to load e_hello_world.srec\n");
  return EXIT_FAILURE;
 }

 usleep(10000);

 e_read(&mbuf, 0, 0, 0, buf, ShmSize);

 // Print the message and close the workgroup.
 printf("\"%s\"\n", buf);
 e_close(&dev);
}

あー、なんていうのこの気持ち。
このサンプルでやっていることは、言葉にすると次のようになります
『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/

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

Tags

About Author

sakamoto

Leave a Comment

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Recent Comments

Social Media