インターネットデパート - 取扱い商品数1000万点以上の通販サイト。送料無料商品も多数あります。

OpenCL入門(改訂第2版): OpenCL1.2でGPGPUの世界へ

価格: ¥0
カテゴリ: Kindle版
Amazon.co.jpで確認
 本書はC言語とOpenCL1.2の入門書を購入して勉強している方や、OpenCL1.2を学びたいC/C++プログラマーのための副読本です。

※誤植、改善点、追加内容等がある場合は随時更新していきます。Amazonの「コンテンツと端末の管理」ページで本の自動更新機能を有効にしてください。6月18日更新、ベクトル関数のバグの修正と、mm_malloc.hについての注意書きを補記しました。

内容


 OpenCLの基本的な概念及び基本API(C/C++のホストAPIと、C99規格準拠のカーネルプログラミング言語)の解説とデータ並列プログラミングのパターンを解説します。

 解説する範囲は以下の4つのパターンです。

・還元パターン(Reduction、基数整列アルゴリズムを用いて解説)
・行列転置(Transposition、FFTアルゴリズムを用いて解説)
・バンクコンフリクト対策(ヒストグラム計算を用いて解説)
・ソーティングネットワーク(バイトニックアルゴリズムを用いて解説)

 関数やコマンドのリファレンスもありますので、開発時の参考として使用もできます。

改正第二版の概要



 改訂第二版にあたって以下の内容を追加します。

- 誤字誤植、表現の訂正
- Windows 10(MSYS2)でのOpenCL2.0アプリケーションのビルド
- 共有仮想メモリ(Shared Virtual Memory、OpenCL2.0)
- pipeデータ構造(OpenCL2.0)
- ネスト並列化(カーネル関数から他のカーネル関数を実行、OpenCL 2.0)
- scan/reduce等の並列パターンを実装した関数(OpenCL2.0)
- ブロックシンタックス(OpenCL2.0、カーネル内のラムダ式に相当)

 本書は題名の通りOpenCL1.2を取り扱っており、大半のソースコードはOpenCL 2.0に対応していません。OpenCL1.2はOpenCL2.0との互換性はあるものの、それは1.2のソースコードが所定の手続きや直し(「-cl-std=CL2.0」フラグ、コマンドキュー関数の変更等)を経ずして正常(エラー・警告無し)に2.0環境で動作することを意味しません。

 追加内容はOpenCL1.2環境を理解したうえで、OpenCL2.0に少し取り組む程度の内容です。

 OpenCL 2.2については1.2との継続性・一貫性維持が困難なため出版する場合は別の本として執筆します。

注意点




 読者に理解頂きたき点としては、本書のみを使ってOpenCLを勉強することは不可能ではありませんが、出版社から出ている編集入りの教本や著名な入門書に比べるとあらゆる意味で品質が劣るため、副読本以外の使用には適さないということです。

向いてない読者




- 本書はページ数が1500ページ以上あるにも関わらず編集者の手が入っていません。文章のクオリティーは全般的に良くないので、そうした本を読みたくない方は購入すべきではありません。
- 短期間に仕事で成果を求められている方。時間に余裕が無い方は、本書を購入せずKhronosの仕様書を読むようにしてください。SIMDやOpenMPから短期間でステップアップしたい方は出版社の編集担当者付き技術書を購入してください。(本書はあくまで副読本です)
- プログラミングが初めてという方や、入門書で挫折した方(本書はC言語入門書および並列プログラミング入門書の副読本という位置づけですので、全くのプログラミング初心者が読むことは想定していません)

Windows+MSYS2/Linux環境でビルドしたい方




 本書のソースコードはMac OS X/clang/cmakeで検証しました。Windows/Linuxで動作させるには以下の対応が必須です。

- gccではなくg++でビルドしてください
- assert( malloc_zone_check(NULL) )の行をコメントしてください
- malloc/malloc.hのインクルード行をコメントしてください
- mm_malloc.hの_mm_malloc関数を使ってるソースコードが1~2個あります。それらのソースでは、代わりにstdlib.hをインクルードしてposix_memalignを使ってください

 MSYSでのビルドは以下のようにします。

$ g++ main.c -lOpenCL

 標準ライブラリー参照パスにlibOpenCL.aが無いとビルドできませんので、dlltoolでOpenCL.DLLから変換したlibOpenCL.aを/mingw64/libディレクトリーにコピーしてください。

OpenCL2.0でサンプルコードをビルドしたい方




 OpenCL2.0に対応させたい方は、clCreateCommandQueueの部分を以下のように書き換えてビルドしてください。


#ifdef CL_VERSION_2_0
cl_command_queue_properties prop[] = ;
queue = clCreateCommandQueueWithProperties(context, device, prop, &cl_err);
#else
queue = clCreateCommandQueue(context, device, 0, &cl_err);
#endif


 またカーネル側でネスト並列やパイプ、SVM(連結リスト)等に対応させるには以下のように「-cl-std=CL2.0」をビルドオプションに設定してください。


const char* options = "-cl-std=CL2.0";
err = clBuildProgram(program, 0, NULL, options, NULL, NULL);


 全てのOpenCL1.2ソースコードを検証し直してはいませんが、大半はこれで動作するはずです。

必要知識と対象読者




 本書の読者はC/C++でコーディングをしたことがあるエンジニア(業務で使う主言語はCでなくともよい)と想定します。C言語を触ったことがない層は、C言語、C++の専門書を読み理解できてから読むようにしてください。

 C言語の熟練者やOpenCLを使ったフレームワークを設計に従事する開発者は、本書よりも直接規格書や出版社が出している技術書を購入してください。

開発環境


 本書ではIntel Core I5の内蔵HD Graphics 4000を検証に使います。OpenCL 1.2の検証環境は

- Max OS X 10.9.5

 となります。Macの検証環境には以下3つのソフトウェアをインストールしています。

- GNU Make 3.81
- CMake 3.2.2(3.1以降)
- clang-503.0.38(g++も可、C++バインディングを使うためgccでは一部ソースコードは動作しません)

 OpenCL 2.0の検証環境は

- Intel Pentium G4560(Kabylake)
- Windows 10
- MSYS2
- gcc/make/cmake
- Intel SDK for OpenCL Applications

 となります。主にIntelのBroadwell~SkylakeやAMDの最新CPU/iGPU/dGPU向けと考えください。

目次



I. OpenCLアーキテクチャー


II. OpenCLランタイムAPI


III. OpenCL-Cコンパイラ


6. OpenCL C言語プログラミング



IV. 並列アルゴリズム


7. ヒストグラム
8. Bitonic Sort(バイトニックソート)
9. 基数整列
10. 高速フーリエ変換
11. 2次元高速フーリエ変換

A. OpenCL対応デバイス一覧表


B. OpenCL 1.2 API Reference


C. OpenCLエラーコード


D. libpng

E. OpenGLバッファとの同期


E.1. グラフィックハードウェアの用語まとめ
E.2. GLEW(OpenGL Extension Wrangler Library)
E.3. OpenGLについてのまとめ
E.11. OpenGLの実装例