本記事では、ALF のバンドル化されたワークブロック分配と、ローカルメモリのサイズ制限からワークブロックが分割されたデータを格納することができない場合にタスクコンテキストを使って対応する方法を学びます。
この例では、2つの大きなベクトルの内積を計算します。式は以下のようになります:
図 1.2つの大きなベクトルの内積
内積の計算では、ベクトルの要素ごとの積を計算して累積する必要があります。1つのワークブロックがベクトルAi と Biの全てのデータを保持できる場合には、計算は単純です。しかし、ベクトルのサイズが非常に大きくて1つのワークブロックに収まらない場合、単純なアプローチではうまく動きません。
例えば、Cell/B.E.プロセッサでは、SPEには256KBのローカルメモリしかありません。長さが16384を超えると、2つの倍精度のベクトルを格納することができません (訳注:16384 * sizeof(double) * 2 = 16K * 8B * 2 = 256KB)。さらに、ダブルバッファリングやコードなどのためにも余分なメモリを必要としますので、それぞれ7500個の倍精度浮動小数点要素を持つ2つのベクトルを扱うのがせいぜいです(7500 * 8[size of double] * 2[two vectors] * 2[double buffer] でほぼ240KBのローカルメモリを消費します)。このような場合には、大きなベクトルは複数のワークブロックに分割しなくてはならず、それぞれのワークブロックは内積計算の部分的な結果を返すことになります。
ホストが各ワークブロックの部分結果を足し合わせて最終的な結果を得るという方法もあります。しかし、これはエレガントな方法ではなく、パフォーマンスの影響も受けます。よりよい方法は、この足し合わせをアクセラレータ側でかつ並列に行うものです。
この問題に対して、ALF は次の2つの実装方法を用意しています :
- タスクコンテキストとバンドル化ワークブロック分配を利用した実装。
- マルチユースワークブロックを利用した実装。タスクコンテキストまたはワークブロックパラメータ/コンテキストバッファを一緒に使用します。
この2つの実装のソースコードが以下のサンプルディレクトリにありますので比べてみましょう :
- タスクコンテキストとバンドル化ワークブロック分配を利用した実装は task_context/dot_prod ディレクトリ。
- マルチユースワークブロックと、タスクコンテキストまたはワークブロックパラメータ/コンテキストバッファを利用した実装は task_context/dot_prod_multi ディレクトリ。
この実装方法では、1つのベクルに対応するすべてのワークブロックがバンドルにまとめらます。1つのバンドルに対応するすべてのワークブロックは1つのタスクインスタンスにキューに入れられた順に割り当てられます。つまり、タスクコンテキストを中間結果の足し合わせに利用することができ、最後のワークブロックが処理されたら最終結果を書きだします。
新しいワークブロックバンドルが開始される度に、タスクコンテキスト内の足し合わせバッファを0に初期化します。
バンドル中の最後のワークブロックが処理されたら、タスクコンテキスト内の累積値を出力バッファにコピーし、結果格納エリアに書き出します。
図 2 は、この実装の概略図です。
図 2. タスクコンテキストとバンドル化ワークブロック分配の利用
マルチユースワークブロックと、タスクコンテキストまたはワークブロックパラメータ/コンテキストバッファの利用
2番目の実装方法は、マルチユースワークブロックと、ワークブロックパラメータ、コンテキストバッファによるものです。マルチユースワークブロックは、反復処理に似ています。アクセラレータ側のランタイムは、指定された反復回数に達するまで、繰り返しワークブロックを処理します。アクセラレータによるデータ分割を利用することで、ワークブロックの各反復において異なる入力データへのアクセスが可能です。
つまりアプリケーションは(ローカルメモリの制限によって)1つのワークブロックが扱えうことができるよりも大きなデータを扱えるということです。また、反復作業の間を通じてマルチユースワークブロックのパラメータとコンテキストバッファは保持されるので、タスクコンテキストバッファの代わりに累積値を格納するためのバッファとして利用できます。
図 3 はこの実装の概略図です。
図 3. マルチユースワークブロックと、タスクコンテキストまたはワークブロックパラメータ/コンテキストバッファの利用
2つの実装方法—タスクコンテキストの利用と、マルチユースワークブロックの利用—は、どちらも同じように使えます。
学ぶために
- 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 の技術要約も用意されています。
