2014/10/13

OpenCLについて理解する

OpenCLの書籍(OpenCL Programming Guide)とOpenCLの仕様書を読んで少しはOpenCLについてわかったので、メモを残しておきます。
詳しくは書籍または仕様書にて確認ください。

  • OpenCLはCPUとGPU,さらにはDSPなどをも並列計算のリソースとして活用できるようにするプラットフォーム
  • OpenCLはISO C99をベースにしたOpenCL C言語を使用
  • OpenCLはベンダーに依存しないオープンな規格
  • データ単位またはタスク単位での並列プログラミングモデルをサポート
  • 組み込みデバイス用のプラットフォームも提供

OpenCL プラットフォーム
OpenCLプラットフォームは一つ以上のOpenCLデバイスから構成されます。
OpenCLデバイスはひとつ以上のCompute Unitに分けられ、さらにCompute Unitは複数のProcessing Elementに分けられます。
実際の計算はProcessing Elementが行います。


OpenCLのプラットフォーム(OpenCL 仕様書より)
ホストPC上には複数のプラットフォーム(AMDのOpenCLランタイム、nVidiaのOpenCLランタイムなど)が同居できます。

OpenCLカーネルとOpenCLプログラム
OpenCLカーネルは、Processing Element上で実行可能なコードを持つオブジェクトです。
OpenCLプログラムは、OpenCLカーネルの集まりです。

ワークグループとワークアイテム
画像データなどを並列処理する場合、計算元のデータはいくつかのグループに分けられます。
一つのワークグループには一つ以上のワークアイテムが所属します。
ワークアイテム=Processing element、ワークグループ=Compute Unitとなります。

メモリの管理
ホスト(デスクトップPC,ノートPC、その他)にメモリが積まれているように、OpenCLデバイスにもメモリが積まれています。OpenCLデバイス上のメモリは、4つの使われ方をします。

  • グローバルメモリ  すべてのワークアイテムから読み書き可能なメモリ領域です。同期コマンドを使用しない限りは、メモリの一貫性は保証されません。
  • コンスタントメモリ グローバルメモリに置かれる読み取り専用の領域です。ここにはカーネルが実行するコードが置かれます。

  • ローカルメモリ 各ワークグループに割り当てられたメモリ領域です。同一ワークグループに所属するワークアイテムからは自由に読み書きできますが、他のワークグループからはアクセスすることができません。
  • プライベートメモリ 各ワークアイテムに割り当てられたメモリです。他のワークアイテムからはアクセスできません。
メモリ(OpenCL 仕様書より)

コマンドキュー
OpenCLはメモリの転送、プログラムの実行などのコマンドをキューに貯めこんで処理していくコマンドキュー方式で動作しています。プログラマが明示的に同期コマンドを発行しない場合は、前のコマンドが完了していなくても次のコマンドの実行が開始されます。


プログラムの実行方法(かなり大雑把)
  1. ホストプログラム上でOpenCLデバイスを検索します。
  2. OpenCLデバイスを選び、コンテキストを作成します。
  3. コンテキストを使ってOpenCL コマンドキュー、OpenCLカーネル、OpenCLプログラム、OpenCLメモリオブジェクトを作成します。
  4. コマンドキューにカーネル、メモリ、プログラムを放り込んでOpenCLデバイスに転送し、処理を実行させます。
  5. 終わったらホストプログラムから結果を読み込みます。

以上、OpenCLの簡単なメモでした。

0 件のコメント:

コメントを投稿