« PPE, SPE の役割分担 | メイン | libspe2 »
2008年01月07日
libspe1, libspe2
CBE(Cell Broadband Engine) の SDK は Ver.3.0 が最新版なんだけど、これで使うライブラリに libspe がある。libpspe1 まではスレッドが割とお手軽にコンテキストと一緒になって生成できた。
libsp1 だとこんな感じだったのだ、
FixStars のサンプルコードより抜粋、
/* SPEスレッドの生成とスタート */
printf("Create and Start spe program\n");
for (i = 0; i < SPE_NUM; i++) {
spe_id[i] =
spe_create_thread(0, spe_handle[i], (void *) &dma_data[i],
NULL, -1, 0);
if (spe_id[i] == 0) {
printf("[ERR] Can't create spe%d thread\n", i);
return -1;
}
}/* PPEプログラムはフラグをSPEプログラム毎にSPE_STARTに設定 */
for (i = 0; i < SPE_NUM; i++) {
dma_data[i].flag = SPE_START;
printf("%d:flag=%d\n", i, dma_data[i].flag);
}/* SPE_DONEに変わるまで待つ */
for (i = 0; i < SPE_NUM; i++) {
while (dma_data[i].flag != SPE_DONE);
/* SPEプログラム処理終了後のフラグ */
printf("%d:flag=%d\n", i, dma_data[i].flag);
}for (i = 0; i < SPE_NUM; i++) {
/* SPEスレッドの終了待ち */
printf("Waiting spe%d program is finish...", i);
spe_wait(spe_id[i], &status[i], 0);
printf("done\n");/* SPEスレッドの破棄 */
printf("Relese spe%d program\n", i);
spe_close_image(spe_handle[i]);
}
libspe2 になってから大きく枠組みが変わった。(これが一番かわったところと言っても良いかもしれない。)自前で pthread を用いて、書かなければいけなくなった。これ、けっこう俺的には面倒くさい。なぜなら、libspe2 だと spe に仕事を投げる時にブロックしてしまうからだ。以下のメソッドを使って spe に投げる
spe_context_run(spe, &entry, 0, NULL, NULL, NULL);
spe で完了するまで戻ってこないから、戻って来たのを監視するスレッドを立ち上げないと行けないというわけだ。これ以外にもやり方はもちろん色々あって spe を自律的に動かすような仕組みもある。俺的には spe のオーバーヘッドを小さくする意味で、ppe のスレッドによるスケジューリングをやりたい。
投稿者 skykiz : 2008年01月07日 07:17
トラックバック
このエントリーのトラックバックURL:
http://www.teamknox.com/mt/mt-tb.cgi/546