parallella触ろう #01
こんにちは。Sakamotoです。
気付いたら前回から何か月たってんのよみたいになるけど、第一回はーじまーるよー(遅
前回のおさらい
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 4x4のタイルの中からランダムに選んだ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/
になります。 次回はもう少し別のことやってみたいと思います。たとえば…えー、なんだろう



Discussion