Python OpenCL入門


著者
1. 執筆の背景
2. 必要知識と対象読者
3. 開発環境
本書で使用する用語
I. PyOpenCL
1. PyOpenCL
2. 検証環境
3. Python環境設定
3.1. Pythonのインストール
3.2. Pythonの基本パッケージのインストール
3.3. PyOpenCLのインストール
3.4. PIL(Python Image Library)のインストール
3.5. PyOpenCLのIDE
4. OpenCL開発環境
4.1. OpenCLのインストール
4.1.1. AMD Linux(Ubuntu)
4.1.2. NVIDIA Linux
4.1.3. Intel Linux(Ubuntu)
4.1.4. Intel Windows
4.1.5. AMD Linux(Windows)
4.1.6. NVIDIA Windows
4.2. Intel SDKインストール手順(Ubuntu)
5. APIとアーキテクチャ
5.1. プラットフォームAPI
5.2. ランタイムAPI
5.3. カーネルプログラミング言語
6. PyOpenCL
6.1. 基本実装
7. メモリーモデル
7.1. デバイスメモリへのコピー
7.1.1. デバイスメモリ複製のユーティリティ関数
8. Arrayクラス
8.1. Arrayクラス
8.1.1. Arrayの属性
8.1.2. Arrayのメソッド
8.2. Arrayファクトリー
8.2.1. to_device
8.2.2. empty
8.2.3. zeros
8.2.4. empty_like
8.2.5. zeros_like
8.2.6. arange
8.3. PyOpenCLデータ型
8.3.1. スカラー型
8.3.2. ベクトル型
8.3.3. 複素数
9. 組み込み数値計算ライブラリ
9.1. pyopencl.clmathライブラリ
10. カスタムカーネル(組み込み)
10.1. ElementwiseKernel
11. MapReduceアルゴリズム
11.1. 組み込みReductionカーネル
12. PrefixSumアルゴリズム
12.1. Scanカーネル
12.2. InclusiveScan
12.3. ExclusiveScan
II. OpenCLアーキテクチャ
13. OpenCLの概要
13.1. OpenCLバージョンについて
13.2. Pythonバインディング
13.2.1. PyCL
13.2.2. PyOpenCL
13.3. 最新動向
13.3.1. Altera FPGAの登場
13.4. 背景(ヘテロジニアス・マルチコア)
13.5. OpenCLの特徴
13.6. OpenCLフレームワークモデル
13.6.1. プラットフォームモデル
13.6.2. 実行モデル(Execution Model)
13.6.3. メモリーモデル
13.6.4. プログラミングモデル
13.7. OpenCLカーネルプログラミング
13.7.1. カーネル関数
13.7.2. 引数とバッファオブジェクト
13.7.3. カーネルカウンタ
13.8. OpenCL SDK
13.8.1. Ubuntu 18.04
13.8.2. Mac OS X
13.8.3. Installable Client Driver(ICD)
13.8.4. Windows
13.8.5. Linux
13.9. 検証環境
13.9.1. Mac Mini Late 2012の仕様
13.9.2. CPU/GPUデバイス
13.9.3. OpenCLデバイス情報
13.9.4. Intel第3・4世代CPU内蔵グラフィックボード
13.9.5. Intel Gen8/Gen9アーキテクチャ
13.10. Intel HD Graphics
13.11. Intel HD3000とHD4000の比較
13.12. Intel GPUとNVIDIA GPUのベンチマーク比較
13.13. SIMD
13.13.1. SSE/AVX
13.14. Autovectorization
13.14.1. 明示的ベクトル化
13.14.2. 暗黙的ベクトル化
13.15. Compute UnitとProcessing Element
13.15.1. なぜPEの理解は開発者にとって重要でないのか?
13.15.2. Execution Unit(Intel)
13.15.3. Streaming MultiProcessor(NVIDIA)
13.15.4. Compute Unit(AMD GCN)
13.16. サポートするプロセッサー
13.17. ワークグループ
13.17.1. CL_DEVICE_MAX_WORK_ITEM_SIZES
13.18. NDRange
13.18.1. NDRange:1次元
13.18.2. NDRange:2次元
13.18.3. NDRange:3次元
13.19. メモリー領域
13.19.1. privateメモリ
13.19.2. localメモリ
13.19.3. globalメモリ
13.19.4. constantメモリ
13.20. メモリレイテンシ
13.20.1. メモリ・キャッシュ帯域
13.21. 共有ローカルメモリ
13.21.1. Intel(第3~4世代以降のCPUアーキテクチャ)
13.21.2. NVIDIA
13.21.3. AMD
13.22. Stalls(ストール)
13.23. メモリストライド
13.23.1. キャッシュライン
13.23.2. バンク
13.24. 2次元アクセスパターン
III. PyOpenCLランタイム
14. HelloWorldプログラム
14.1. HelloWorldプログラムの環境設定
14.2. カーネル関数のソースコード
14.3. HelloWorld(タスク並列プログラミング)
14.3.1. 出力
14.4. HelloWorld(データ並列プログラミング)
14.4.1. 例外クラス
15. OpenCLホストAPI
15.1. Platform
15.1.1. pyopencl.Platform
15.1.2. get_devices
15.1.3. get_info
15.1.4. platform_info
15.2. 実装例
15.3. Deviceのクエリー
15.3.1. pyopencl.Platform.get_devices
15.3.2. device_type
15.3.3. get_info
15.3.4. device_info
15.4. Context
15.4.1. create_some_context
15.4.2. context_properties
15.4.3. get_info
15.4.4. context_info
16. OpenCLランタイム
16.1. コマンドキュー
16.1.1. CommandQueue
16.1.2. command_queue_properties
16.1.3. from_int_ptr
16.1.4. command_queue_info
16.2. バッファオブジェクト
16.2.1. pyopencl.Buffer
16.2.2. mem_flags
16.2.3. Intel iGPU
16.3. バッファーの読み込み・書き込み・コピー
16.3.1. enqueue_read_bufferとenqueue_write_buffer
16.3.2. enqueue_copy
16.3.3. clEnqueueFillBuffer
16.4. バッファオブジェクトのマップ
16.4.1. enqueue_map_buffer
16.5. イメージオブジェクト
16.5.1. 検証環境の準備
16.5.2. Image
16.5.3. 実装例
16.5.4. イメージデータのバッファ
16.5.5. ImageFormat
16.5.6. イメージ記述子(mem_object_type)
16.5.7. get_supported_image_formats
16.5.8. サポートするイメージ型式
16.6. イメージの読み込みと書き込み
16.6.1. enqueue_read_imageとenqueue_write_image
16.7. プログラムオブジェクト
16.7.1. Program
16.8. 実行プログラムのビルド
16.8.1. build
16.8.2. ビルドオプション
16.9. コンパイラ(ビルド)オプション
16.10. リンカーオプション
16.11. プログラムオブジェクトのクエリ
16.11.1. get_info
16.11.2. cl_program_info
16.11.3. get_build_info
16.11.4. program_build_info
16.12. カーネルオブジェクト
16.13. カーネル引数設定
16.13.1. set_arg
16.14. カーネルオブジェクト情報の取得
16.14.1. get_info
16.14.2. kernel_info
16.14.3. get_work_group_info
16.14.4. kernel_work_group_info
16.14.5. get_arg_info
16.14.6. kernel_arg_info
16.15. カーネルの実行
16.15.1. enqueue_nd_range_kernel
16.15.2. enqueue_task
IV. カーネルプログラミング
17. OpenCL C言語プログラミング
17.1. カーネルプログラミング
17.2. 組み込みデータ型
17.2.1. 組み込みスカラデータ型
17.2.2. ホストAPIとの対応
17.2.3. バイト順序
17.2.4. 組み込みベクトルデータ型
17.2.5. その他の組み込みデータ型
17.2.6. 予約組み込みデータ型
17.2.7. ベクトル・コンポーネント
17.2.8. ラウンド・端数処理モード
17.2.9. 整数型OpenCLマクロ
17.3. その他の関数
17.3.1. printf関数
17.4. 組み込み関数
17.4.1. ワークアイテム関数
17.4.2. 数学関数
17.4.3. half型、native型数学関数
17.4.4. 浮動小数点定数
17.4.5. 倍精度
17.5. 整数関数
17.5.1. MADと乗算
17.5.2. 飽和演算
17.6. 型変換
17.6.1. 暗黙型変換
17.6.2. 明示的型変換(キャスト)
17.6.3. 変換関数
17.7. 幾何関数
17.8. 比較関数
17.8.1. 比較分岐
17.9. ベクトルデータ読み出し・変換関数
17.9.1. ベクトルload・store関数
17.9.2. 同期関数
17.9.3. 明示的メモリフェンス関数
17.9.4. 非同期複製・先読み関数
17.9.5. アトミック関数
17.9.6. shuffle
17.10. OpenCL-Cイメージ処理関数
17.10.1. 正規化整数チャンネルデータ型の活用による浮動小数点変換
17.10.2. サンプラー
17.10.3. イメージ読み込み・書き込み関数
17.11. サンプラー無し読み込み
17.12. イメージ書き込み関数
17.13. イメージ情報の取得
17.13.1. イメージチャンネルのマッピング
V. PyOpenCL実装
18. ヒストグラム
18.1. アルゴリズムのパラメータ
18.2. 共有ローカルメモリ
18.3. ストライドとメモリアクセス
18.4. ストライドとBank Conflict
18.5. Stride型のアルゴリズム
18.6. バンクコンフリクトの緩和対策の実装例
18.7. アトミック型のアルゴリズム
19. 高速フーリエ変換(Fast Fourier Transform)
19.1. 使用する数学のまとめ
19.2. フーリエ変換(Fourier Transform)の定義
19.3. 離散フーリエ変換(Discrete Fourier Transform)
19.4. 高速フーリエ変換(Fast Fourier Transform)
19.4.1. Cooley-Tukey型アルゴリズム
19.4.2. Bit Reversal
19.5. 実装例(CPU)
19.6. 実装例(GPU)
20. 2次元高速フーリエ変換
20.1. 実装例(GPGPU)
20.2. 2次元カーネルの実装
20.2.1. 全体の流れ
20.3. GPGPUへの修正点(メモリストライド・Bank Conflict対策)
21. Bitonic Sort(バイトニックソート)
21.1. バイトニック配列の構築
21.2. バイトニックマージ
21.3. バイトニックソートのOpenCL実装例
21.4. カーネルの実装(bitonic split)
21.5. カーネルの実装(bitonic merge)
22. 基数配列
22.1. ヒストグラム
22.2. Bucket Scan
22.3. Reduction(還元)
22.3.1. 結合性
22.3.2. 交換性
22.4. Prefix Sumへの適用
22.5. up-sweep(掃き上げ)
22.5.1. down-sweep(掃き下げ)
22.6. 並び替え(Rank)
22.7. 実装例(CPU)
22.7.1. ヒストグラム
22.7.2. Prefix-Sum
22.7.3. 並び替え
22.8. 実装例(GPU)
22.8.1. Up-sweep(GPU)
22.8.2. down-sweep
22.8.3. 並び替え(rearrange)
23. 参考書籍とWebリソース
VI. 付録
A. OpenCL対応デバイス一覧表
B. OpenCL 1.2 API Reference
B.1. 組み込みスカラデータ型
B.2. ホストAPIとの対応
B.3. 組み込みベクトルデータ型
B.3.1. ベクトルデータ型の実装
B.4. その他の組み込みデータ型
B.5. 予約組み込みデータ型
B.6. ベクトル・コンポーネント
B.7. ラウンド・端数処理モード
B.8. Platform
B.8.1. clGetPlatformIDs
B.8.2. clGetPlatformInfo
B.8.3. cl_platform_info
B.9. Device
B.9.1. clGetDeviceIDs
B.9.2. cl_device_type
B.9.3. clGetDeviceInfo
B.9.4. cl_device_info
B.10. Context
B.10.1. clCreateContext
B.10.2. cl_context_properties
B.10.3. clCreateContextFromType
B.10.4. clRetainContext
B.10.5. clReleaseContext
B.10.6. clGetContextInfo
B.10.7. cl_context_info
B.11. コマンドキュー
B.11.1. clCreateCommandQueue
B.11.2. cl_command_queue_properties
B.11.3. clRetainCommandQueue
B.11.4. clReleaseCommandQueue
B.11.5. cl_command_queue_info
B.12. バッファオブジェクト
B.12.1. clCreateBuffer
B.12.2. cl_mem_flags
B.13. バッファーの読み込み・書き込み・コピー
B.13.1. clEnqueueReadBufferとclEnqueueWriteBuffer
B.13.2. clEnqueueReadBufferRectとclEnqueueWriteBufferRect
B.13.3. clEnqueueCopyBuffer
B.13.4. clEnqueueCopyBufferRect
B.13.5. clEnqueueFillBuffer
B.14. バッファオブジェクトのマップ
B.14.1. clEnqueueMapBuffer
B.15. イメージオブジェクト
B.15.1. clCreateImage
B.15.2. イメージデータのバッファ
B.15.3. cl_image_format
B.15.4. イメージ記述子
B.15.5. clGetSupportedImageFormats
B.15.6. サポートするイメージ型式
B.16. イメージの読み込みと書き込み
B.16.1. clEnqueueReadImageとclEnqueueWriteImage
B.16.2. clEnqueueCopyImage
B.16.3. clEnqueueFillImage
B.16.4. clEnqueueCopyImageToBuffer
B.16.5. clEnqueueCopyBufferToImage
B.17. イメージオブジェクトのマッピング
B.17.1. clEnqueueMapImage
B.17.2. cl_map_flags
B.18. イメージ情報取得
B.18.1. clGetImageInfo
B.18.2. cl_image_info
B.19. サンプラーオブジェクト
B.19.1. clCreateSampler
B.19.2. clRetainSampler
B.19.3. clReleaseSampler
B.19.4. clGetSamplerInfo
B.19.5. cl_sampler_info
B.20. オブジェクトのライフサイクル
B.20.1. clRetainMemObject
B.20.2. clReleaseMemObject
B.20.3. clSetMemObjectDestructorCallback
B.21. マップされたメモリオブジェクトをアンマップ
B.21.1. clEnqueueUnmapMemObject
B.22. プログラムオブジェクト
B.22.1. clCreateProgramWithSource
B.22.2. clCreateProgramWithBinary
B.22.3. clCreateProgramWithBuiltInKernels
B.22.4. clRetainProgram
B.22.5. clReleaseProgram
B.23. 実行プログラムのビルド
B.23.1. clBuildProgram
B.23.2. ビルドオプション
B.24. プログラムのリンク、コンパイル
B.24.1. clCompileProgram
B.25. プログラムのリンク
B.25.1. clLinkProgram
B.26. コンパイラ(ビルド)オプション
B.27. リンカーオプション
B.28. OpenCLコンパイラのアンロード
B.28.1. clUnloadPlatformCompiler
B.29. プログラムオブジェクトのクエリ
B.29.1. clGetProgramInfo
B.29.2. cl_program_info
B.29.3. clGetProgramBuildInfo
B.29.4. cl_program_build_info
B.30. カーネルオブジェクト
B.30.1. clCreateKernel
B.30.2. clCreateKernelsInProgram
B.30.3. clRetainKernel
B.30.4. clReleaseKernel
B.31. カーネル引数設定
B.31.1. clSetKernelArg
B.32. カーネルオブジェクト情報の取得
B.32.1. clGetKernelInfo
B.32.2. cl_kernel_info
B.32.3. clGetKernelWorkGroupInfo
B.32.4. cl_kernel_work_group_info
B.32.5. clGetKernelArgInfo
B.32.6. cl_kernel_arg_info
B.33. カーネルの実行
B.33.1. clEnqueueNDRangeKernel
B.33.2. clEnqueueTask
B.33.3. clEnqueueNativeKernel
B.34. Flush・Finish
B.34.1. clFlush
B.34.2. clFinish
B.35. イベントオブジェクト
B.35.1. clCreateUserEvent
B.35.2. clSetUserEventStatus
B.35.3. clWaitForEvents
B.35.4. clGetEventInfo
B.35.5. cl_event_info
B.36. プロファイリング
B.36.1. clGetEventProfilingInfo
B.36.2. cl_profiling_info
B.37. マーカー・バリアー・イベント待機
B.37.1. clEnqueueMarkerWithWaitList
B.37.2. clEnqueueBarrierWithWaitList
B.38. 組み込み関数
B.38.1. ワークアイテム関数
B.38.2. 数学関数
B.38.3. half型、native型数学関数
B.38.4. 浮動小数点演算
B.38.5. 倍精度
B.39. 整数関数
B.39.1. MADと乗算
B.39.2. 飽和演算
B.39.3. 整数型OpenCLマクロ
B.40. その他の関数
B.40.1. printf関数
B.41. 幾何関数
B.42. 比較関数
B.43. ベクトルデータ読み出し・変換関数
B.43.1. ベクトルload関数
B.43.2. 同期関数
B.43.3. 明示的メモリフェンス関数
B.43.4. 非同期複製・先読み関数
B.43.5. アトミック関数
B.43.6. shuffle
B.44. OpenCL-Cイメージ処理関数
B.44.1. サンプラー
B.44.2. イメージ読み込み・書き込み関数
B.45. サンプラー無し読み込み
B.46. イメージ書き込み関数
B.47. イメージ情報の取得
B.47.1. イメージチャンネルのマッピング
B.48. OpenGLバッファとの同期
B.48.1. clCreateFromGLBuffer
B.48.2. clCreateFromGLTexture
B.48.3. clGetGLObjectInfo
B.48.4. clGetGLTextureInfo
B.48.5. clEnqueueAcquireGLObjects
B.48.6. clEnqueueReleaseGLObjects
C. OpenCLエラーコード
Index

List of Figures

3.1. PyCharmの基本設定
5.1. 図:OpenCL API UMLクラス図
13.1. 図表:プロセッサー・アーキテクチャー
13.2. 図表:メモリー・アーキテクチャー
13.3. 図:Intel Sliceアーキテクチャー
13.4. 図:Execution Unit
13.5. 図表:ワークグループ(1次元)
13.6. 図表:NDRange2次元
13.7. 図表:NDRange3次元
13.8. 図表:メモリー・アーキテクチャー
13.9. 図:キャッシュライン(1 cacheline, 16 work-items)
13.10. 図:キャッシュライン(2 cacheline, 16 work-items)
13.11. 図:キャッシュライン(4 cacheline, 8 work-items)
13.12. 図:キャッシュライン(4 cacheline, 4 work-items)
13.13. 図:キャッシュライン(4 cacheline, 8 work-items)
13.14. 図:フル帯域
13.15. 図:フル帯域
13.16. 図:フル帯域
13.17. 図:半帯域
13.18. 図:1/16帯域(16 Bank Conflicts)
13.19. 図:フル帯域
13.20. 図:行列乗算のアクセスパターン(下部は転置後のパターン)
16.1. SAMPLE.png
16.2. SAMPLE3.png
17.1. シャッフル
18.1. 図:フル帯域
18.2. 図:半帯域
18.3. 図:1/16帯域(16 Bank Conflicts)
18.4. 図:フル帯域
19.1. 図:FFT整列ネットワーク(N=8)
20.1. 図:2次元FFTの手順
21.1. 16個の要素のバイトニック整列(注意:図を縮小するため、8個の要素だけを表示)
22.1. Bucket Scanの算出式(要素8の場合)
22.2. 図:シーケンシャルな還元
22.3. 図:並列化した還元
22.4. 図:並列化した還元のSIMD使用パターン
22.5. 図:交換性を利用した還元アルゴリズム
22.6. 図:交換性を利用したアルゴリズムのSIMD使用パターン

Copyright 2018-2019, by Masaki Komatsu