本記事では、ALF タスクコンテキストを使って各タスクインスタンスで別々に計算された結果を保存し、それらを統合して最終結果を作る方法を学びます。
この例では、大きなデータセットから最小値と最大値を探索します。逐次コードはとてもシンプルな教科書通りの実装になります。データセット全体に渡って比較と最良の値の更新を繰り返す線形探索のコードです。
ALFフレームワークを使えばこの逐次コードを並列アルゴリズムに変換することができます。まずデータセットを小さなワークブロックに分割します。そして各ワークブロックはアクセラレータで実行中の各タスクインスタンスに割り当てられます。各タスクインスタンスの計算カーネルが呼び出されて、割り当てられたワークブロックから最大値または最小値を探します。全てのワークブロックが処理された時点で、複数の最大値/最小値候補が各タスクインスタンスのコンテキストに格納されています。それから、ALFランタイムはアクセラレータ上のコンテキストマージ関数を実行し、中間結果のリダクション処理を行って最終結果を生成します。
図 1. 最小値/最大値探索の仕組み
図 1 は最小値/最大値探索プログラムがどのように動くかを表しています。サンプルコードはsampleディレクトリのtask_context/min_maxにあります。より複雑な応用を作る場合にもこのサンプルをテンプレートとして使うことができるでしょう。
次は計算カーネルのコードセクションです。計算カーネルは与えられた入力バッファから最大値と最小値を探し、task_contextをそれらの値で更新します。
/* ---------------------------------------------- */
/* アクセラレータ側のコード */
/* ---------------------------------------------- */
/* 計算カーネル関数 */
int comp_kernel(void *p_task_context, void *p_parm_ctx_buffer,
void *p_input_buffer, void *p_output_buffer,
void *p_inout_buffer, unsigned int current_count,
unsigned int total_count)
{
my_task_context_t *p_ctx = (my_task_context_t *) p_task_context;
my_wb_parms_t *p_parm = (my_wb_parms_t *) p_parm_ctx_buffer;
alf_data_int32_t *a = (alf_data_int32_t *)p_input_buffer;
unsigned int size = p_parm->num_data;
unsigned int i;
/* 最良の値をコンテキストバッファへ格納する */
for(i=0;i<size;i++) {
if(a[i]>p_ctx->max)
p_ctx->max = a[i];
else if(a[i]<p_ctx->min)
p_ctx->min = a[i];
}
return 0;
}
|
次のコードはcontext_merge関数です。ALFランタイムは、すべてのタスクインスタンスがすべてのワークブロックの処理を終えたのち、自動的にこの関数を呼び出します。タスクインスタンスがこの関数を使ってマージされ、最終的な最小値/最大値がタスクコンテキストに格納されます。
/* コンテキストマージ関数 */
int ctx_merge(void* p_task_context_to_be_merged,
void* p_task_context)
{
my_task_context_t *p_ctx = (my_task_context_t *) p_task_context;
my_task_context_t *p_mgr_ctx = (my_task_context_t *)
p_task_context_to_be_merged;
if(p_mgr_ctx->max > p_ctx->max)
p_ctx->max = p_mgr_ctx->max;
if(p_mgr_ctx->min < p_ctx->min)
p_ctx->min = p_mgr_ctx->min;
return 0;
}
|
今回はALF タスクコンテキストを使って各タスクインスタンスの部分的な計算結果を保持し、それらを統合して最終結果を生成する方法を学びました。
学ぶために
- RSS feedを使って、このシリーズの更新をチェックしましょう。(developerWorks Japan RSS フィードについてはこちら.)
- 本記事で解説されている内容の原文はAccelerated Library Framework for Cell Broadband Engine Programmer's Guide and API Referenceを参照してください。
- Fun with ALF シリーズの他の記事もチェックしましょう。
- 手軽に読める他のALF関連ガイドも見てみましょう:
- "Introducing ALF."
- "10 major ALF concepts."
- "Programming with ALF: Basic ALF application structure."
- "Programming with ALF: Double buffering."
- "Programming with ALF: Handling ALF constraints."
- "Programming with ALF: Optimizing ALF applications."
- "ALF and hybrid x86."
- もっとCell/B.E.プログラミングを学ぶには、次のdeveloperWorksシリーズに挑戦しましょう:
- "Programming high-performance applications on the Cell/B.E. processor"
- "PS3 fab-to-lab"
- "The little broadband engine that could"
- The IBM Semiconductor Solutions Technical Library のCell Broadband Engine documentation セクションには、ダウンロードマニュアルや、仕様書などたくさんの有益な情報があります。
- developerWorks ニュースレターに登録すると、最新の開発者向けニュースと Cell/B.E. に関する最新情報を毎週メールで受け取れます。ニュースレターで Cell/B.E. 関連のニュースを受信するには、登録する際にPower Architecture® にチェック・マークを付けてください。
製品や技術を入手するために
- 全ての Cell/B.E. 関連記事、ディスカッションフォーラム、ダウンロードなどは IBM developerWorks の Cell Broadband Engine resource center にあります。
- Cell/B.E.カスタム製品やカスタムプロセッサを用いたソリューションのお問い合わせはこちら: Contact us about Cell Broadband Engine technology.
- IBM SDK for Multicore Acceleration 3.0を入手しましょう。また、Cell/B.E. 資料のライブラリーにも情報が網羅されています。
議論するために
- ディスカッション・フォーラムに参加してください。
- 質問はIBM developerWorks Power Architecture Cell Broadband Engine discussion forum へ投稿してください。フォーラムに投稿された興味深い問題と答えは、定期的に集められたこちらの"Forum watch" ブログシリーズでハイライトされています。
- Cell Broadband Engine/Power Architecture ブログにアクセスして、Cell/B.E. やその他の Power Architecture 関連技術に関するニュース、ダウンロード、資料、イベント通知を参照してください。人気の高い"Forum watch"ブログ・シリーズ (Q&A 要約) と"FixIt"技術更新情報、それに Infobomb の技術要約も用意されています。
