Java-OpenCL入門

小松正樹 [FAMILY Given]


著者
1. 執筆の背景
2. 必要知識と対象読者
3. 開発環境
本書で使用する用語
I. OpenCLアーキテクチャー
1. OpenCLの概要
1.1. OpenCLバージョンについて
1.2. Javaバインディング
1.2.1. JOCL(jocl.org)
1.2.2. JOCL (jogamp.org)
1.2.3. Aparapi
1.2.4. JavaCL
1.2.5. LWJGL
1.2.6. まとめ
1.3. 最新動向
1.3.1. Altera FPGAの登場
1.4. 背景(ヘテロジニアス・マルチコア)
1.5. OpenCLの特徴
1.6. OpenCLフレームワークモデル
1.6.1. プラットフォームモデル
1.6.2. 実行モデル(Execution Model)
1.6.3. メモリーモデル
1.6.4. プログラミングモデル
1.7. OpenCLカーネルプログラミング
1.7.1. カーネル関数
1.7.2. 引数とバッファオブジェクト
1.7.3. カーネルカウンタ
2. APIとアーキテクチャ
2.1. プラットフォームAPI
2.2. ランタイムAPI
2.3. カーネルプログラミング言語
2.4. OpenCL SDK
2.4.1. Mac OS X
2.4.2. Installable Client Driver(ICD)
2.4.3. Windows
2.4.4. Linux
2.5. 検証環境
2.5.1. Mac Mini Late 2012の仕様
2.5.2. CPU/GPUデバイス
2.5.3. OpenCLデバイス情報
2.5.4. Intel第3・4世代CPU内蔵グラフィックボード
2.5.5. Intel Gen8/Gen9アーキテクチャ
2.6. Intel HD Graphics
2.7. Intel HD3000とHD4000の比較
2.8. Intel GPUとNVIDIA GPUのベンチマーク比較
2.9. SIMD
2.9.1. SSE/AVX
2.10. Autovectorization
2.10.1. 明示的ベクトル化
2.10.2. 暗黙的ベクトル化
2.11. Compute UnitとProcessing Element
2.11.1. なぜPEの理解は開発者にとって重要でないのか?
2.11.2. Execution Unit(Intel)
2.11.3. Streaming MultiProcessor(NVIDIA)
2.11.4. Compute Unit(AMD GCN)
2.12. サポートするプロセッサー
2.13. ワークグループ
2.13.1. CL_DEVICE_MAX_WORK_ITEM_SIZES
2.14. NDRange
2.14.1. NDRange:1次元
2.14.2. NDRange:2次元
2.14.3. NDRange:3次元
2.15. メモリー領域
2.15.1. privateメモリ
2.15.2. localメモリ
2.15.3. globalメモリ
2.15.4. constantメモリ
2.16. メモリレイテンシ
2.16.1. メモリ・キャッシュ帯域
2.17. 共有ローカルメモリ
2.17.1. Intel(第3~4世代以降のCPUアーキテクチャ)
2.17.2. NVIDIA
2.17.3. AMD
2.18. Stalls(ストール)
2.19. メモリストライド
2.19.1. キャッシュライン
2.19.2. バンク
2.20. 2次元アクセスパターン
II. Java OpenCLランタイムAPI
3. OpenCL開発環境
3.1. 検証環境
3.1.1. OpenCLのインストール
3.1.2. JOCLがサポートするSDK
4. JNI(Java Native Interface)
4.1. JNIの開発環境
4.1.1. JDK(Mac OS X)
4.2. ビルド
4.2.1. javah
4.2.2. JNIバイナリのビルド
4.3. ハローワールド (JNI) の続き
4.4. 型の対応
4.4.1. JNI引数の例
5. JNA(Java Native Access)
5.1. Maven2
5.2. 検証環境の構成
5.2.1. Maven (HomeBrew)
5.3. 関数のマッピング
5.4. Java・Cとネイティブ型の対応
5.5. ハローワールド (JNA)
5.6. ビルド
6. JOCL
6.1. java.nio.Buffer
6.2. Pointerオブジェクト
7. HelloWorldプログラム
7.1. HelloWorldプログラムの環境設定
7.2. カーネル・ソースファイル(.cl)の読み込み
7.3. HelloWorld(タスク並列プログラミング)
7.3.1. 出力
7.4. HelloWorld(データ並列プログラミング)
7.4.1. エラー表示関数
8. OpenCLホストAPI
8.1. Platform
8.1.1. clGetPlatformIDs
8.1.2. clGetPlatformInfo
8.1.3. cl_platform_info
8.2. Deviceのクエリー
8.2.1. clGetDeviceIDs
8.2.2. cl_device_type
8.2.3. clGetDeviceInfo
8.2.4. cl_device_info
8.3. Context
8.3.1. clCreateContext
8.3.2. cl_context_properties
8.3.3. clCreateContextFromType
8.3.4. clRetainContext
8.3.5. clReleaseContext
8.3.6. clGetContextInfo
8.3.7. cl_context_info
9. OpenCLランタイム
9.1. コマンドキュー
9.1.1. clCreateCommandQueue
9.1.2. cl_command_queue_properties
9.1.3. clRetainCommandQueue
9.1.4. clReleaseCommandQueue
9.1.5. cl_command_queue_info
9.2. バッファオブジェクト
9.2.1. clCreateBuffer
9.2.2. cl_mem_flags
9.2.3. Intel iGPU
9.3. バッファーの読み込み・書き込み・コピー
9.3.1. clEnqueueReadBufferとclEnqueueWriteBuffer
9.3.2. 矩形領域
9.3.3. clEnqueueReadBufferRectとclEnqueueWriteBufferRect
9.3.4. clEnqueueCopyBuffer
9.3.5. clEnqueueCopyBufferRect
9.3.6. clEnqueueFillBuffer
9.4. バッファオブジェクトのマップ
9.4.1. clEnqueueMapBuffer
9.5. オブジェクトのライフサイクル
9.5.1. clRetainMemObject
9.5.2. clReleaseMemObject
9.5.3. clSetMemObjectDestructorCallback
9.6. マップされたメモリオブジェクトをアンマップ
9.6.1. clEnqueueUnmapMemObject
9.7. イメージオブジェクト
9.7.1. 検証環境の準備
9.7.2. clCreateImage
9.7.3. 実装例
9.7.4. イメージデータのバッファ
9.7.5. cl_image_format
9.7.6. イメージ記述子
9.7.7. clGetSupportedImageFormats
9.7.8. サポートするイメージ型式
9.8. イメージの読み込みと書き込み
9.8.1. clEnqueueReadImageとclEnqueueWriteImage
9.8.2. clEnqueueCopyImage
9.8.3. clEnqueueFillImage
9.8.4. clEnqueueCopyImageToBuffer
9.8.5. clEnqueueCopyBufferToImage
9.9. イメージオブジェクトのマッピング
9.9.1. clEnqueueMapImage
9.9.2. cl_map_flags
9.10. イメージ情報取得
9.10.1. clGetImageInfo
9.10.2. cl_image_info
9.11. サンプラーオブジェクト
9.11.1. clCreateSampler
9.11.2. clRetainSampler
9.11.3. clReleaseSampler
9.11.4. clGetSamplerInfo
9.11.5. cl_sampler_info
9.12. プログラムオブジェクト
9.12.1. カーネルソースファイルの読み込みの復習
9.12.2. clCreateProgramWithSource
9.12.3. clCreateProgramWithBinary
9.12.4. clCreateProgramWithBuiltInKernels
9.12.5. clRetainProgram
9.12.6. clReleaseProgram
9.13. 実行プログラムのビルド
9.13.1. clBuildProgram
9.13.2. ビルドオプション
9.14. コンパイラ(ビルド)オプション
9.15. リンカーオプション
9.16. OpenCLコンパイラのアンロード
9.16.1. clUnloadPlatformCompiler
9.17. プログラムオブジェクトのクエリ
9.17.1. clGetProgramInfo
9.17.2. cl_program_info
9.17.3. clGetProgramBuildInfo
9.17.4. cl_program_build_info
9.18. カーネルオブジェクト
9.18.1. clCreateKernel
9.18.2. clCreateKernelsInProgram
9.18.3. clRetainKernel
9.18.4. clReleaseKernel
9.19. カーネル引数設定
9.19.1. clSetKernelArg
9.20. カーネルオブジェクト情報の取得
9.20.1. clGetKernelInfo
9.20.2. cl_kernel_info
9.20.3. clGetKernelWorkGroupInfo
9.20.4. cl_kernel_work_group_info
9.20.5. clGetKernelArgInfo
9.20.6. cl_kernel_arg_info
9.21. カーネルの実行
9.21.1. clEnqueueNDRangeKernel
9.21.2. clEnqueueTask
9.21.3. clEnqueueNativeKernel
9.22. イベントオブジェクト
9.22.1. clCreateUserEvent
9.22.2. clSetUserEventStatus
9.22.3. clWaitForEvents
9.22.4. clGetEventInfo
9.22.5. cl_event_info
9.23. マーカー・バリアー・イベント待機
9.23.1. clEnqueueMarkerWithWaitList
9.23.2. clEnqueueBarrierWithWaitList
9.24. プロファイリング
9.24.1. clGetEventProfilingInfo
9.24.2. cl_profiling_info
9.25. Flush・Finish
9.25.1. clFlush
9.25.2. clFinish
III. カーネルプログラミング
10. OpenCL C言語プログラミング
10.1. カーネルプログラミング
10.2. 組み込みデータ型
10.2.1. 組み込みスカラデータ型
10.2.2. ホストAPIとの対応
10.2.3. バイト順序
10.2.4. 組み込みベクトルデータ型
10.2.5. その他の組み込みデータ型
10.2.6. 予約組み込みデータ型
10.2.7. ベクトル・コンポーネント
10.2.8. ラウンド・端数処理モード
10.2.9. 整数型OpenCLマクロ
10.3. その他の関数
10.3.1. printf関数
10.4. 組み込み関数
10.4.1. ワークアイテム関数
10.4.2. 数学関数
10.4.3. half型、native型数学関数
10.4.4. 浮動小数点定数
10.4.5. 倍精度
10.5. 整数関数
10.5.1. MADと乗算
10.5.2. 飽和演算
10.6. 型変換
10.6.1. 暗黙型変換
10.6.2. 明示的型変換(キャスト)
10.6.3. 変換関数
10.7. 幾何関数
10.8. 比較関数
10.8.1. 比較分岐
10.9. ベクトルデータ読み出し・変換関数
10.9.1. ベクトルload・store関数
10.9.2. 同期関数
10.9.3. 明示的メモリフェンス関数
10.9.4. 非同期複製・先読み関数
10.9.5. アトミック関数
10.9.6. shuffle
10.10. OpenCL-Cイメージ処理関数
10.10.1. 正規化整数チャンネルデータ型の活用による浮動小数点変換
10.10.2. サンプラー
10.10.3. イメージ読み込み・書き込み関数
10.11. サンプラー無し読み込み
10.12. イメージ書き込み関数
10.13. イメージ情報の取得
10.13.1. イメージチャンネルのマッピング
IV. Java OpenCL実装
11. ヒストグラム
11.1. アルゴリズムのパラメータ
11.2. 共有ローカルメモリ
11.3. ストライドとメモリアクセス
11.4. ストライドとBank Conflict
11.5. Stride型のアルゴリズム
11.6. バンクコンフリクトを緩和する実装例
11.7. アトミック型のアルゴリズム
12. 高速フーリエ変換(Fast Fourier Transform)
12.1. 使用する数学のまとめ
12.2. フーリエ変換(Fourier Transform)の定義
12.3. 離散フーリエ変換(Discrete Fourier Transform)
12.4. 高速フーリエ変換(Fast Fourier Transform)
12.4.1. Cooley-Tukey型アルゴリズム
12.4.2. Bit Reversal
12.5. 実装例(CPU)
12.6. 実装例(GPU)
13. 2次元高速フーリエ変換
13.1. 画像
13.2. 2次元への適用アルゴリズム
13.3. PNG画像の高域フィルターをCPUで実装
13.3.1. 高域フィルターの出力
13.4. 実装例(GPGPU)
13.5. 2次元カーネルの実装
13.5.1. 全体の流れ
13.6. GPGPUへの修正点(メモリストライド・Bank Conflict対策)
13.7. FFT-2Dで画像処理
14. Bitonic Sort(バイトニックソート)
14.1. バイトニック配列の構築
14.2. バイトニックマージ
14.3. バイトニックソートのOpenCL実装例
14.4. カーネルの実装(bitonic split)
14.5. カーネルの実装(bitonic merge)
15. 基数整列
15.1. ヒストグラム
15.2. Bucket Scan
15.3. Reduction(還元)
15.3.1. 結合性
15.3.2. 交換性
15.4. Prefix Sumへの適用
15.5. up-sweep(掃き上げ)
15.6. down-sweep(掃き下げ)
15.7. 並び替え(Rank)
15.8. 実装例(CPU)
15.8.1. ヒストグラム
15.8.2. Prefix-Sum
15.8.3. 並び替え
15.9. 実装例(GPU)
15.9.1. Up-sweep(GPU)
15.9.2. down-sweep
15.9.3. 並び替え(rearrange)
15.9.4. マルチキュー実装(CPU+GPU)
16. 参考書籍とWebリソース
V. 付録
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. Makeツール
C.1. Makefile
C.1.1. Makefile(MinGW)
C.2. cmake
D. OpenCLエラーコード
Index

図の一覧

1.1. 図表:プロセッサー・アーキテクチャー
1.2. 図表:メモリー・アーキテクチャー
2.1. 図:OpenCL API UMLクラス図
2.2. 図:Intel Sliceアーキテクチャー
2.3. 図:Execution Unit
2.4. 図表:ワークグループ(1次元)
2.5. 図表:NDRange2次元
2.6. 図表:NDRange3次元
2.7. 図表:メモリー・アーキテクチャー
2.8. 図:キャッシュライン(1 cacheline, 16 work-items)
2.9. 図:キャッシュライン(2 cacheline, 16 work-items)
2.10. 図:キャッシュライン(4 cacheline, 8 work-items)
2.11. 図:キャッシュライン(4 cacheline, 4 work-items)
2.12. 図:キャッシュライン(4 cacheline, 8 work-items)
2.13. 図:フル帯域
2.14. 図:フル帯域
2.15. 図:フル帯域
2.16. 図:半帯域
2.17. 図:1/16帯域(16 Bank Conflicts)
2.18. 図:フル帯域
2.19. 図:行列乗算のアクセスパターン(下部は転置後のパターン)
9.1. 図:矩形領域の用例:グレー部分が処理範囲で、それ以外の範囲は不要で切り捨てる
9.2. SAMPLE.png
9.3. SAMPLE3.png
10.1. シャッフル
11.1. 図:フル帯域
11.2. 図:半帯域
11.3. 図:1/16帯域(16 Bank Conflicts)
11.4. 図:フル帯域
12.1. 図:FFT整列ネットワーク(N=8)
13.1. SAMPLE3.png
13.2. 図:2次元FFTの手順
13.3. 図:入力画像
13.4. 図:出力画像(高域フィルター)
14.1. 16個の要素のバイトニック整列(注意:図を縮小するため、8個の要素だけを表示)
15.1. Bucket Scanの算出式(要素8の場合)
15.2. 図:シーケンシャルな還元
15.3. 図:並列化した還元
15.4. 図:並列化した還元のSIMD使用パターン
15.5. 図:交換性を利用した還元アルゴリズム
15.6. 図:交換性を利用したアルゴリズムのSIMD使用パターン

Copyright 2018-2019, by Masaki Komatsu