本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。プロフィールで選択した情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

Fun with ALF: 第 5 回 オーバーラップI/Oバッファを利用した行列の加算

行列を加算する2つの例を通じて、ALFのオーバーラップI/Oバッファの使い方を紹介します。

Kane Scarlett, Editor, Multicore acceleration, IBM
Kane Scarlett
Kane Scarlett は技術ジャーナリスト/アナリストとして20年の経験があり、National Geographic, Population Reference Bureau, Miller Freeman, IDGで記事を書いています。また、恐れ多くも各種のジャーナル誌、JavaWorldLinuxWorld、そしてもちろんdeveloperWorksへの記事の管理、編集、執筆を行っています。

概要: 今回のCell Broadband Engine™ (Cell/B.E.) シリーズでは、Accelerated Library Framework (ALF) オーバーラップI/Oバッファを使って行列の加算を行う方法を学びます。本記事は "ALF for Cell/B.E. Programmer's Guide and API Reference, Version 3.0" (参考文献を参照) を基にしています。

このシリーズの他の記事を見る

日付:  2008年 6月 03日
レベル:  初級 この記事の原文:  英語
アクティビティー: 3304 ビュー
お気軽にご意見・ご感想をお寄せください: 


もっと Fun with ALF

Fun with ALF シリーズでもっといろいろなことを学びましょう:

  • "Fun with ALF: 第 1 回 大きな行列の加算" (developerWorks, March 2008) では、ALFを使って2つの大きな行列を加算する方法を(ホストデータ分割とアクセラレータ分割の例で)説明しています。
  • "Fun with ALF: 第 2 回 I/Oデータの変換" (developerWorks, March 2008) で、16ビットの入力データを8ビットの出力バッファに変換するために、大きなルックアップテーブルとしてタスクコンテキストバッファをどのように使うのかを学びましょう。
  • "Fun with ALF: 第 3 回 最小値と最大値の探索" (developerWorks, April 2008) では、タスクコンテキスを使って各タスクインスタンスで部分的な計算結果を保持し、そしてそれら部分結果を統合して最終結果を得る方法を示します。
  • "Fun with ALF: 第 4 回 大きなベクトルの内積の計算" (developerWorks, April 2008) では、ローカルメモリサイズの制限からワークブロックが分割されたデータを保持できない場合に対処するために、バンドル化ワークブロック分配とタスクコンテキストを使用する方法を明らかにします。
  • "タスク依存関係 (Task dependency)"では、2つのステージを持つパイプラインアプリケーションを題材にタスクの依存関係を使う簡単なシミュレーションを行います。

そして、Cell/B.E.プログラミングを簡単にしてくれる、DaCS、BLASそしてその他の技術に関するFun withシリーズもみてみましょう。

はじめに

オーバーラップI/Oバッファとは、入力と出力両方のデータを含んだワークブロックのバッファです。入力と出力の区分けは各ワークブロックに対して動的に指定されます。 このバッファはアクセラレータのメモリを最大限使いたい場合や入力バッファを出力データで上書きしてもよい場合に特に有効です。

入力バッファに転送されるデータは、ホストメモリ内の大きなデータセットのバラバラの区域から転送されて、アクセラレータの入力バッファに集められることがあります (訳注:ギャザー転送のこと)。 ALFフレームワークは入力データの不要な複製を避けることでパフォーマンス上のオーバーヘッドを最小化しています。

出力バッファは、単一の連続したアクセラレータ上のメモリです。 出力データはホストメモリ上の大きな出力バッファのバラバラの区域に転送されることがあります (訳注:スキャッター転送のこと)。計算カーネルが1つのワークブロックの処理を終えた後、出力バッファ内のデータはワークブロックが作成された時にalf_wb_dtl_entry_addルーチンで指定されたホストメモリ内の位置へ移動されます。

次の2つのシンプルな例で、オーバーラップI/Oの使い方を見てみましょう。 どちらも行列の加算の例です。

行列のセットアップ

このコードはFun with ALF: 第 1 回 大きな行列の加算matrix_add の例とよく似ています。関連部分のみリスト1に示します。


リスト 1. 行列のセットアップ

/* ---------------------------------------------- */ 
/* matrix declaration for the two cases           */ 
/* ---------------------------------------------- */ 
#ifdef C_A_B // C = A + B 
       alf_data_int32_t mat_a[ROW_SIZE][COL_SIZE]; // the matrix a 
       alf_data_int32_t mat_b[ROW_SIZE][COL_SIZE]; // the matrix b 
       alf_data_int32_t mat_c[ROW_SIZE][COL_SIZE]; // the matrix c 
#else // A = A + B 
       alf_data_int32_t mat_a[ROW_SIZE][COL_SIZE]; // the matrix a 
       alf_data_int32_t mat_b[ROW_SIZE][COL_SIZE]; // the matrix b 
#endif

ワークブロックのセットアップ

リスト2では2つの場合でワークブロックを作成する流れについて示しています。


リスト 2. ワークブロックの作成

for (i = 0; i < ROW_SIZE; i+=PART_SIZE){ 
     if(i+PART_SIZE <= ROW_SIZE) 
        wb_parm.num_data = PART_SIZE; 
     else 
        wb_parm.num_data = ROW_SIZE - i; 

     alf_wb_create(task_handle, ALF_WB_SINGLE, 0, &wb_handle); 

     #ifdef C_A_B // C = A + B 
            // 入力データ A, B 
            alf_wb_dtl_begin(wb_handle, ALF_BUF_OVL_IN, 0); // オフセットは 0 
            alf_wb_dtl_entry_add(wb_handle, &mat_a[i][0], wb_parm.num_data*COL_SIZE, 
             ALF_DATA_INT32); // A 
            alf_wb_dtl_entry_add(wb_handle, &mat_b[i][0], wb_parm.num_data*COL_SIZE, 
             ALF_DATA_INT32); // B 
            alf_wb_dtl_end(wb_handle); 

            // 出力データ C は、入力データ A と同じ領域
            // オフセットは 0 、つまり入力データ A と同じ領域
            alf_wb_dtl_begin(wb_handle, ALF_BUF_OVL_OUT, 0); 
            alf_wb_dtl_entry_add(wb_handle, &mat_c[i][0], wb_parm.num_data*COL_SIZE, 
             ALF_DATA_INT32); // C 
            alf_wb_dtl_end(wb_handle); 
     
      #else // A = A + B 
            // 入力および出力データ A 
            alf_wb_dtl_begin(wb_handle, ALF_BUF_OVL_INOUT, 0); // offset 0 
            alf_wb_dtl_entry_add(wb_handle, &mat_a[i][0], wb_parm.num_data*COL_SIZE, 
             ALF_DATA_INT32); // A 
            alf_wb_dtl_end(wb_handle); 

            // 入力データ B は、A の後ろに配置する
            alf_wb_dtl_begin(wb_handle, ALF_BUF_OVL_IN, 
             wb_parm.num_data*COL_SIZE*sizeof(alf_data_int32_t)); 
            alf_wb_dtl_entry_add(wb_handle, &mat_b[i][0], wb_parm.num_data*COL_SIZE, 
             ALF_DATA_INT32); // B 
            alf_wb_dtl_end(wb_handle); 
      #endif 
      alf_wb_parm_add(wb_handle, (void *)&wb_parm, sizeof(wb_parm)/sizeof(unsigned int), 
       ALF_DATA_INT32, 0); 
      alf_wb_enqueue(wb_handle); 
}

アクセラレータのセットアップ

リスト3はアクセラレータのコードです。どちらの場合でも出力用のscは、saおよびsbと同じアクセラレータのメモリにセットされています。


リスト 3. サンプルコード

/* ---------------------------------------------- */ 
/* the accelerator side code                      */ 
/* ---------------------------------------------- */ 
/* the computation kernel function                */ 
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) 
{ 
  unsigned int i, cnt; 
  int *sa, *sb, *sc; 
  my_wb_parms_t *p_parm = (my_wb_parms_t *) p_parm_context; 

  cnt = p_parm->num_data * COL_SIZE; 

  sa = (int *) p_inout_buffer; 
  sb = sa + cnt; 
  sc = sa; 

  for (i = 0; i < cnt; i ++) 
       sc[i] = sa[i] + sb[i]; 

  return 0; 
}

まとめ

本記事では、オーバーラップI/Oバッファを使って行列の加算を行う2つの例を紹介しました。


参考文献

学ぶために

製品や技術を入手するために

議論するために

著者について

Kane Scarlett

Kane Scarlett は技術ジャーナリスト/アナリストとして20年の経験があり、National Geographic, Population Reference Bureau, Miller Freeman, IDGで記事を書いています。また、恐れ多くも各種のジャーナル誌、JavaWorldLinuxWorld、そしてもちろんdeveloperWorksへの記事の管理、編集、執筆を行っています。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Multicore acceleration
ArticleID=365046
ArticleTitle=Fun with ALF: 第 5 回 オーバーラップI/Oバッファを利用した行列の加算
publish-date=06032008
author1-email=kane@us.ibm.com
author1-email-cc=