本記事では、16ビットの入力データを8ビットの出力データへ変換する例を通じて、Accelerated Library Framework (ALF) のタスクコンテキストバッファを大きなルックアップテーブルとして使う方法を学びます。ルックアップテーブルは65536個の要素を持ち、次のように定義されています。
For all -32768 <= in <32768
/ 0, in < -4096
Table(n)=| in/32 -4096 <=in<4096
\ 255, in >= 4096
|
次以降のセクションでは、必要最小限に絞ったコードを提示しています。あまり面白みのないルーチンは削除してあり、カギとなる特徴的な部分のみに焦点があてられるようになっています。ホストコードはタスクコンテキストバッファ(ルックアップテーブル)を既に初期化しておりまたテーブルは読み込み専用データとして使われるので、コンテキストセットアップ関数およびコンテキストマージ関数をアクセラレーション側に用意する必要はありません。
このサンプルは、もっと複雑なアプリケーションを作るためのテンプレートとして使うことができるでしょう。
次のコード片は、ホストとアクセラレータが共有するデータの構造体です。my_task_context_t データ構造体は、ルックアップテーブルを格納します。my_wb_parms_t データ構造体は各ワークブロックに対するパラメータとコンテキストデータとして使われます。
/* ---------------------------------------------- */
/* ホストとアクセラレータで共有されるデータ構造体 */
/* ---------------------------------------------- */
typedef struct _my_task_context_t
{
alf_data_byte_t table[65536];
} my_task_context_t;
typedef struct _my_wb_parms_t
{
alf_data_uint32_t num_data; /* number of data in this WB */
} my_wb_parms_t;
|
次は、このアプリケーションでタスクデスクリプタをどのようにセットアップしているかのコード片です。タスクコンテキストに関連した情報はコード中に太字フォントで示してあります。
alf_task_desc_create(alf_handle, 0, &task_desc_handle;);
/* タスクデスクリプタのセットアップ */
/* 計算カーネルの名前 */
alf_task_desc_set_int64(task_desc_handle,
ALF_TASK_DESC_ACCEL_KERNEL_REF_L, "comp_kernel");
/* タスクコンテキストバッファーのサイズ */
alf_task_desc_set_int32(task_desc_handle,
ALF_TASK_DESC_TSK_CTX_SIZE, sizeof(my_task_context_t));
/* ワークブロックパラメータバッファーのサイズ */
alf_task_desc_set_int32(task_desc_handle,
ALF_TASK_DESC_WB_PARM_CTX_BUF_SIZE, sizeof(my_wb_parms_t));
/* 入力バッファーのサイズ */
alf_task_desc_set_int32(task_desc_handle,
ALF_TASK_DESC_WB_IN_BUF_SIZE,
PART_SIZE*sizeof(alf_data_int16_t));
/* 出力バッファーのサイズ */
alf_task_desc_set_int32(task_desc_handle,
ALF_TASK_DESC_WB_OUT_BUF_SIZE,
PART_SIZE*sizeof(alf_data_byte_t));
/* タスクコンテキストエントリー */
alf_task_desc_ctx_entry_add(task_desc_handle, ALF_DATA_BYTE,
sizeof(my_task_context_t)/sizeof(alf_data_byte_t));
|
次はワークブロックを作成するコードを見てみましょう。
/* ワークブロックの作成と、パラメータとI/Oバッファの追加 */
for (i = 0; i < NUM_DATA; i += PART_SIZE)
{
alf_wb_create(task_handle, ALF_WB_SINGLE, 0, &wb_handle);
alf_wb_dtl_begin(wb_handle, ALF_BUF_IN, 0); /* 入力 (input) */
alf_wb_dtl_entry_add(wb_handle, pcm16_in+i, PART_SIZE, ALF_DATA_INT16);
alf_wb_dtl_end(wb_handle);
alf_wb_dtl_begin(wb_handle, ALF_BUF_OUT, 0); /* 出力 (output) */
alf_wb_dtl_entry_add(wb_handle, pcm8_out+i,PART_SIZE, ALF_DATA_BYTE);
alf_wb_dtl_end(wb_handle);
wb_parm.num_data = PART_SIZE;
alf_wb_parm_add(wb_handle, (void *)&wb_parm, /* ワークブロックパラメータ (wb parm) */
sizeof(wb_parm)/sizeof(unsigned int), ALF_DATA_INT32, 0);
alf_wb_enqueue(wb_handle);
}
|
次はアクセラレータ側のコードです。タスクコンテキストを変更しているコード部分は太字で示しています。
/* ---------------------------------------------- */
/* アクセラレータ側のコード */
/* ---------------------------------------------- */
/* 計算カーネル関数 */
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_int16_t *in = (alf_data_int16_t *)p_input_buffer;
alf_data_byte_t *out = (alf_data_byte_t *)p_output_buffer;
unsigned int size = p_parm->num_data;
unsigned int i;
// 実にシンプルなテーブルルックアップ
for(i=0;i<size;i++)
{
out[i] = p_ctx->table[(unsigned short)in[i]];
}
return 0;
}
|
完了です!16ビットの入力データを8ビットの出力データへ変換するために、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 の技術要約も用意されています。
