Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
OpenCLに触れてみよう

          2011/10/29 You&I
          一般公開バージョン


    わんくま同盟 名古屋勉強会 #19
自己紹介

•   H/N   You&I(読み:ユーアンドアイ)
•   出身    生まれも育ちも名古屋市
•   年齢    30代前半
•   本職    商学部出身の職業プログラマ
•   言語    C++, C#,
          VisualBasic 6.0, 日本語COBOL
• 日記      http://d.hatena.ne.jp/youandi/
• 所属      名古屋アジャイル勉強会
          プログラミング生放送 名古屋支部
          わんくま同盟
               わんくま同盟 名古屋勉強会 #19
ナゼ、イッタイ。

• 2010/03/13に開催した名古屋勉強会#12で
  「Cell/B.Eプログラミング事始め」というセッショ
  ンを発表しました。
• その発表で時代はGPGPUだよ!って締めた
  んですが、それから放置してました。
• 最近OpenCLってGPUが無くても実行できる
  環境がある事を知ったり。
• 来年のお仕事でGPGPUを使いそう。


          わんくま同盟 名古屋勉強会 #19
用語集

• GPGPU
  – General Purpose Graphic Processing Units。
    GPUを画像処理以外の目的で利用する事。
• オフラインコンパイラ
  – デバイス上で実行するOpenCLのカーネルプログ
    ラムをプログラム実行中ではなく、実行前に作成
    する為のコンパイラ。LLVMが使われる事が多い。
• DSP(Digital Signal Processor)
  – デジタル信号処理に特化したプロセッサ。高速に
    計算を行う事ができる。
                わんくま同盟 名古屋勉強会 #19
Agenda

1.   OpenCLとは
2.   OpenCLの環境構築
3.   OpenCLの構造
4.   OpenCLを使ったデモ
5.   まとめ




            わんくま同盟 名古屋勉強会 #19
1. OpenCLとは

1.   OpenCLとは
2.   OpenCLの環境構築
3.   OpenCLの構造
4.   OpenCLを使ったデモ
5.   まとめ




            わんくま同盟 名古屋勉強会 #19
1. OpenCLとは(1/6)

• OpenCLとはOpen Computing Languageの
  略称。
• Apple社により提案された後、OpenGL等の
  標準化団体 KHRONOSグループにより標準
  が策定されている。
 – http://www.khronos.org/opencl/




               わんくま同盟 名古屋勉強会 #19
1. OpenCLとは(2/6)

• OpenCLはマルチコアCPU・GPU・Cellプロ
  セッサ・DSP等の異種混在のプロセッサーを
  利用する並列コンピューティングの為のフレー
  ムワーク。
• OpenCLを利用する事により、様々な計算資
  源に共通のインターフェースでアクセス・制御
  が可能となる。
• C99規格をベースとした「OpenCL C言語」に
  よるカーネル記述にてデバイス向けプログラ
  ムの開発を行う。
         わんくま同盟 名古屋勉強会 #19
1. OpenCLとは(3/6)

• OpenCLの歴史
 – Khronos OpenCL API Registry
   • http://www.khronos.org/registry/cl/
 – 2009年4月:OpenCL 1.0
 – 2010年6月:OpenCL 1.1
 – 2010年6月:OpenCL 1.1 C++ Bindings




                 わんくま同盟 名古屋勉強会 #19
1. OpenCLとは(4/6)

• OpenCLが出てきた背景
 – 様々なPlatform向けのSDK
 – CPU演算(CPU毎)
   • 3DNow!, MMX, SSE, AES-NI, AVX・・・
 – Cell/B.E.演算(デバイス毎)
   • Cell SDK
 – GPGPU演算(ベンダー毎)
   • ATI Stream
   • CUDA
 – ETC, …

                  わんくま同盟 名古屋勉強会 #19
1. OpenCLとは(5/6)

• 1デバイスにつき1SDK・・・。
 – まあこれは仕方ない
• Platform毎にAPI仕様が異なる・・・。
 – これは何とかして欲しい
• そこで出てきたのがOpenCL
 – デバイスにアクセスする為のAPI仕様を統一し、
   様々なPlatform向けに開発をし易くする為のフ
   レームワーク。
 – デバイスの制御を行うだけではなく、並列処理を
   行う為のAPIも提供する。
          わんくま同盟 名古屋勉強会 #19
1. OpenCLとは(6/6)

• OpenCLの発展性
 – 類似技術
   • ATI Stream:AMD
   • CUDA:NVIDIA
   • DirectCompute:Microsoft DirectX 11
 – WebCL
   • ブラウザ上でOpenGLを利用できるようにするWebGL
     に影響を受けて?ブラウザ上でOpenCLを利用できる
     ようにするWebCLという規格も策定中。
      – http://www.khronos.org/webcl/



                  わんくま同盟 名古屋勉強会 #19
2. OpenCLの環境構築

1.   OpenCLとは
2.   OpenCLの環境構築
3.   OpenCLの構造
4.   OpenCLを使ったデモ
5.   まとめ




            わんくま同盟 名古屋勉強会 #19
2. OpenCLの環境構築(1/6)

• 実行ハードウェアは?
 – AMD社 RADEONシリーズGPU
   • RADEON HD4xx0以降
   • http://ja.wikipedia.org/wiki/ATI_FirePro
 – NVIDIA社 GeForceシリーズGPU
   • http://developer.nvidia.com/cuda-gpus
 – Intel社 CoreシリーズCPU
   • SSE4.1対応品(E8x00以降, CPU上で実行時)
   • SSE3対応品(他のGPU上で実行時)



                  わんくま同盟 名古屋勉強会 #19
2. OpenCLの環境構築(2/6)

• OS及びコンパイラは?
 – OpenCL C言語のコンパイラは後述
 – Microsoft Windows
   • 利用するSDKによってはVista以降が必要
   • VisualC++(C++, C言語)
 – Linux
   • gcc(C++, C言語)
 – Apple MacOS X
   • MacOS X 10.6(Snow Leopard)以降
   • Xcode(C++, C言語, Objective-C)

              わんくま同盟 名古屋勉強会 #19
2. OpenCLの環境構築(3/6)

• OpenCL SDKの入手
 – AMD社:AMD APP SDK
   • http://developer.amd.com/appsdk
 – NVIDIA社:CUDA Toolkit, Parallel Nsight
   • http://developer.nvidia.com/cuda-toolkit
   • http://developer.nvidia.com/nvidia-parallel-nsight
 – Intel社:Intel OpenCL SDK
   • http://www.intel.com/go/opencl
 – Apple社:OSに付属(MacOS X 10.6以降)
   • /System/Library/Frameworks/OpenCL.framework

                 わんくま同盟 名古屋勉強会 #19
2. OpenCLの環境構築(4/6)

• 各SDKの特徴(1/2) ※Macは割愛
                               Visual          オフライン   その他
                         C++            デバッガ
     SDK名称                     Studio          コンパイラ   ツール
                         対応              付属
                                対応              付属     付属
AMD APP SDK
(Accelerated Parallel
Processing)
                         ○      ×       ×       ○      ○
CUDA Toolkit
                         ×      ×       ×       ○      ○
Parallel Nsight
(CUDA Toolkit+α)         ×      ○       ○       ○      ○
Intel OpenCL SDK
                         ○      ×       ×       ○      ×
                           わんくま同盟 名古屋勉強会 #19
2. OpenCLの環境構築(5/6)

• 各SDKの特徴(2/2) ※Macは割愛
                        H/Wなし
                                GPU   CPU
     SDK名称              のインス                  -   -
                                実行    実行
                         トール
AMD APP SDK
(Accelerated Parallel
Processing)
                         ○      ○     ○       -   -
CUDA Toolkit
                         ○      ○     ○       -   -
Parallel Nsight
(CUDA Toolkit+α)         ○      ○     ○       -   -
Intel OpenCL SDK
                         ×      ×     ○       -   -
                           わんくま同盟 名古屋勉強会 #19
2. OpenCLの環境構築(6/6)

• インストール先情報
 – AMD APP SDK v2.5
    • include : %ProgramFiles(x86)%¥AMD APP¥
    • sample : %UserProfile%¥My Documents¥AMD APP¥
 – Parallel Nsight v2.0
    • include : %ProgramFiles%¥NVIDIA GPU Computing
      Toolkit¥CUDA¥v4.0¥
    • sample : %ProgramFiles(x86)%¥NVIDIA Parallel Nsight
      2.0¥Samples¥
 – Intel OpenCL SDK v1.5
    • include : %ProgramFiles(x86)%¥Intel¥OpenCL SDK¥1.1¥
    • sample : %SystemDrive%¥Users¥Public¥Documents¥Intel¥O
      penCL SDK¥1.1¥

                   わんくま同盟 名古屋勉強会 #19
3. OpenCLの構造

1.   OpenCLとは
2.   OpenCLの環境構築
3.   OpenCLの構造
4.   OpenCLを使ったデモ
5.   まとめ




            わんくま同盟 名古屋勉強会 #19
3. OpenCLの構造(1/14)

• OpenCLデバイスのイメージ              OpenCLデバイス

 – OpenCLデバイスは1つ以上の            CU

   計算ユニット(CU:Computation        PE   PE   ・・・
   Unit)を持つ。
 – 計算ユニットは1つ以上の処理              CU

   エレメント(PE:Processing          PE   PE   ・・・
   Unit)で構成される。
 – これらのユニットをどのように              CU
   使うかは実装者が指示するか                PE   PE   ・・・
   OpenCLに任せる事も可能。

            わんくま同盟 名古屋勉強会 #19
3. OpenCLの構造(2/14)

• 処理の流れ(1/2)
 1.   ホストプログラム起動
 2.   デバイスハンドル取得
 3.   コマンドキュー作成
 4.   カーネルプログラムをメモリ上に読み込み
 5.   プログラムオブジェクト作成
 6.   カーネルオブジェクト作成
 7.   カーネルオブジェクトをコマンドキューに登録
 8.   コマンドキューから実行結果を取り出す

            わんくま同盟 名古屋勉強会 #19
3. OpenCLの構造(3/14)

• 処理の流れ(2/2)
                      8. メモリ
                     オブジェクト

           3. コマンド             6. カーネル
             キュー      7. 登録    オブジェクト


                               5. プログラム
           2. デバイス
                                オブジェクト



  1. ホスト                                  4. カーネル
 プログラム                                    プログラム


                わんくま同盟 名古屋勉強会 #19
3. OpenCLの構造(4/14)

• OpenCLのAPI(1/11)
  – システムで利用可能なPlatformのIDを取得
  cl_int clGetPlatformIDs(
     cl_uint          /* num_entries */,
     cl_platform_id * /* platforms */,
     cl_uint *        /* num_platforms */
  );




               わんくま同盟 名古屋勉強会 #19
3. OpenCLの構造(5/14)

• OpenCLのAPI(2/11)
  – Platformに含まれるデバイスIDのリストを返す
  cl_int clGetDeviceIDs(
     cl_platform_id   /* platform */,
     cl_device_type   /* device_type */,
     cl_uint          /* num_entries */,
     cl_device_id *   /* devices */,
     cl_uint *        /* num_devices */
  );

              わんくま同盟 名古屋勉強会 #19
3. OpenCLの構造(6/14)

• OpenCLのAPI(3/11)
  – デバイスを指定してコンテキストを作成
  cl_context clCreateContext(
     const cl_context_properties * /* properties */,
     cl_uint                /* num_devices */,
     const cl_device_id * /* devices */,
     void (CL_CALLBACK * /* pfn_notify */)(
              const char *, const void *, size_t, void *),
     void *                 /* user_data */,
     cl_int *               /* errcode_ret */
  );
                     わんくま同盟 名古屋勉強会 #19
3. OpenCLの構造(7/14)

• OpenCLのAPI(4/11)
  – 与えられたコンテキスト・デバイス用のキューを作
     成
  cl_command_queue clCreateCommandQueue(
     cl_context     /* context */,
     cl_device_id   /* device */,
     cl_command_queue_properties
                    /* properties */,
     cl_int *       /* errcode_ret */
  );
             わんくま同盟 名古屋勉強会 #19
3. OpenCLの構造(8/14)

• OpenCLのAPI(5/11)
  – バッファメモリオブジェクトを作成
  cl_mem clCreateBuffer(
     cl_context    /* context */,
     cl_mem_flags  /* flags */,
     size_t        /* size */,
     void *        /* host_ptr */,
     cl_int *      /* errcode_ret */
  );

                わんくま同盟 名古屋勉強会 #19
3. OpenCLの構造(9/14)

• OpenCLのAPI(6/11)
  – カーネルのソースコードからプログラムオブジェク
     トを作成
  cl_program clCreateProgramWithSource(
     cl_context      /* context */,
     cl_uint         /* count */,
     const char **   /* strings */,
     const size_t *  /* lengths */,
     cl_int *        /* errcode_ret */
  );
             わんくま同盟 名古屋勉強会 #19
3. OpenCLの構造(10/14)

• OpenCLのAPI(7/11)
  – 指定されたプログラムオブジェクトをビルド
  cl_int clBuildProgram(
     cl_program           /* program */,
     cl_uint              /* num_devices */,
     const cl_device_id * /* device_list */,
     const char *         /* options */,
     void (CL_CALLBACK * /* pfn_notify */)(
             cl_program, void * ),
     void *               /* user_data */
  );
                   わんくま同盟 名古屋勉強会 #19
3. OpenCLの構造(11/14)

• OpenCLのAPI(8/11)
  – ビルドしたプログラムオブジェクトからカーネルを
     作成する
  cl_kernel clCreateKernel(
     cl_program /* program */,
     const char * /* kernel_name */,
     cl_int *     /* errcode_ret */
  );



            わんくま同盟 名古屋勉強会 #19
3. OpenCLの構造(12/14)

• OpenCLのAPI(9/11)
  – カーネルの引数をセットする
  cl_int clSetKernelArg(
     cl_kernel    /* kernel */,
     cl_uint      /* arg_index */,
     size_t       /* arg_size */,
     const void * /* arg_value */
  );



                  わんくま同盟 名古屋勉強会 #19
3. OpenCLの構造(13/14)

• OpenCLのAPI(10/11)
  – カーネルを実行する為のコマンドをキューに登録
  cl_int clEnqueueTask(
     cl_command_queue/* command_queue */,
     cl_kernel         /* kernel */,
     cl_uint     /* num_events_in_wait_list */,
     const cl_event * /* event_wait_list */,
     cl_event *        /* event */
  );

                わんくま同盟 名古屋勉強会 #19
3. OpenCLの構造(14/14)

• OpenCLのAPI(11/11)
  – バッファオブジェクトからデータを読み込む為のコ
    マンドをキューに登録
  cl_int clEnqueueReadBuffer(
     cl_command_queue           /* command_queue */,
     cl_mem                     /* buffer */,
     cl_bool                    /* blocking_read */,
     size_t                     /* offset */,
     size_t                     /* cb */,
     void *                     /* ptr */,
     cl_uint                    /* num_events_in_wait_list */,
     const cl_event *           /* event_wait_list */,
     cl_event *                 /* event */
  );

                       わんくま同盟 名古屋勉強会 #19
Agenda

1.   OpenCLとは
2.   OpenCLの環境構築
3.   OpenCLの構造
4.   OpenCLを使ったデモ
5.   まとめ




            わんくま同盟 名古屋勉強会 #19
5. OpenCLを使ったデモ

• 何かデモする




           わんくま同盟 名古屋勉強会 #19
5.まとめ

1.   OpenCLとは
2.   OpenCLの環境構築
3.   OpenCLの構造
4.   OpenCLを使ったデモ
5.   まとめ




            わんくま同盟 名古屋勉強会 #19
5. まとめ

• OpenCLが出てきた背景や今後について話を
  しました。
• ホスト側の制御処理が統一されるのは嬉しい。
• デバイス側はデバイスによる機能サポートに
  よって制限をうけるが汎用的に使えるのは嬉
  しい。
• 但し、あるデバイスの性能をフルに活かすに
  はやはり専用APIを使うのが一番速い。


        わんくま同盟 名古屋勉強会 #19
参考情報等

• OpenCL入門 - マルチコアCPU・GPUのため
  の並列プログラミング
 – ISBN:9784844328148, インプレスジャパン
• OpenCL入門 - GPU&マルチコアCPU並列
  プログラミング
 – ISBN:9784798026084, 秀和システム




            わんくま同盟 名古屋勉強会 #19

More Related Content

OpenCLに触れてみよう

  • 1. OpenCLに触れてみよう 2011/10/29 You&I 一般公開バージョン わんくま同盟 名古屋勉強会 #19
  • 2. 自己紹介 • H/N You&I(読み:ユーアンドアイ) • 出身 生まれも育ちも名古屋市 • 年齢 30代前半 • 本職 商学部出身の職業プログラマ • 言語 C++, C#, VisualBasic 6.0, 日本語COBOL • 日記 http://d.hatena.ne.jp/youandi/ • 所属 名古屋アジャイル勉強会 プログラミング生放送 名古屋支部 わんくま同盟 わんくま同盟 名古屋勉強会 #19
  • 3. ナゼ、イッタイ。 • 2010/03/13に開催した名古屋勉強会#12で 「Cell/B.Eプログラミング事始め」というセッショ ンを発表しました。 • その発表で時代はGPGPUだよ!って締めた んですが、それから放置してました。 • 最近OpenCLってGPUが無くても実行できる 環境がある事を知ったり。 • 来年のお仕事でGPGPUを使いそう。 わんくま同盟 名古屋勉強会 #19
  • 4. 用語集 • GPGPU – General Purpose Graphic Processing Units。 GPUを画像処理以外の目的で利用する事。 • オフラインコンパイラ – デバイス上で実行するOpenCLのカーネルプログ ラムをプログラム実行中ではなく、実行前に作成 する為のコンパイラ。LLVMが使われる事が多い。 • DSP(Digital Signal Processor) – デジタル信号処理に特化したプロセッサ。高速に 計算を行う事ができる。 わんくま同盟 名古屋勉強会 #19
  • 5. Agenda 1. OpenCLとは 2. OpenCLの環境構築 3. OpenCLの構造 4. OpenCLを使ったデモ 5. まとめ わんくま同盟 名古屋勉強会 #19
  • 6. 1. OpenCLとは 1. OpenCLとは 2. OpenCLの環境構築 3. OpenCLの構造 4. OpenCLを使ったデモ 5. まとめ わんくま同盟 名古屋勉強会 #19
  • 7. 1. OpenCLとは(1/6) • OpenCLとはOpen Computing Languageの 略称。 • Apple社により提案された後、OpenGL等の 標準化団体 KHRONOSグループにより標準 が策定されている。 – http://www.khronos.org/opencl/ わんくま同盟 名古屋勉強会 #19
  • 8. 1. OpenCLとは(2/6) • OpenCLはマルチコアCPU・GPU・Cellプロ セッサ・DSP等の異種混在のプロセッサーを 利用する並列コンピューティングの為のフレー ムワーク。 • OpenCLを利用する事により、様々な計算資 源に共通のインターフェースでアクセス・制御 が可能となる。 • C99規格をベースとした「OpenCL C言語」に よるカーネル記述にてデバイス向けプログラ ムの開発を行う。 わんくま同盟 名古屋勉強会 #19
  • 9. 1. OpenCLとは(3/6) • OpenCLの歴史 – Khronos OpenCL API Registry • http://www.khronos.org/registry/cl/ – 2009年4月:OpenCL 1.0 – 2010年6月:OpenCL 1.1 – 2010年6月:OpenCL 1.1 C++ Bindings わんくま同盟 名古屋勉強会 #19
  • 10. 1. OpenCLとは(4/6) • OpenCLが出てきた背景 – 様々なPlatform向けのSDK – CPU演算(CPU毎) • 3DNow!, MMX, SSE, AES-NI, AVX・・・ – Cell/B.E.演算(デバイス毎) • Cell SDK – GPGPU演算(ベンダー毎) • ATI Stream • CUDA – ETC, … わんくま同盟 名古屋勉強会 #19
  • 11. 1. OpenCLとは(5/6) • 1デバイスにつき1SDK・・・。 – まあこれは仕方ない • Platform毎にAPI仕様が異なる・・・。 – これは何とかして欲しい • そこで出てきたのがOpenCL – デバイスにアクセスする為のAPI仕様を統一し、 様々なPlatform向けに開発をし易くする為のフ レームワーク。 – デバイスの制御を行うだけではなく、並列処理を 行う為のAPIも提供する。 わんくま同盟 名古屋勉強会 #19
  • 12. 1. OpenCLとは(6/6) • OpenCLの発展性 – 類似技術 • ATI Stream:AMD • CUDA:NVIDIA • DirectCompute:Microsoft DirectX 11 – WebCL • ブラウザ上でOpenGLを利用できるようにするWebGL に影響を受けて?ブラウザ上でOpenCLを利用できる ようにするWebCLという規格も策定中。 – http://www.khronos.org/webcl/ わんくま同盟 名古屋勉強会 #19
  • 13. 2. OpenCLの環境構築 1. OpenCLとは 2. OpenCLの環境構築 3. OpenCLの構造 4. OpenCLを使ったデモ 5. まとめ わんくま同盟 名古屋勉強会 #19
  • 14. 2. OpenCLの環境構築(1/6) • 実行ハードウェアは? – AMD社 RADEONシリーズGPU • RADEON HD4xx0以降 • http://ja.wikipedia.org/wiki/ATI_FirePro – NVIDIA社 GeForceシリーズGPU • http://developer.nvidia.com/cuda-gpus – Intel社 CoreシリーズCPU • SSE4.1対応品(E8x00以降, CPU上で実行時) • SSE3対応品(他のGPU上で実行時) わんくま同盟 名古屋勉強会 #19
  • 15. 2. OpenCLの環境構築(2/6) • OS及びコンパイラは? – OpenCL C言語のコンパイラは後述 – Microsoft Windows • 利用するSDKによってはVista以降が必要 • VisualC++(C++, C言語) – Linux • gcc(C++, C言語) – Apple MacOS X • MacOS X 10.6(Snow Leopard)以降 • Xcode(C++, C言語, Objective-C) わんくま同盟 名古屋勉強会 #19
  • 16. 2. OpenCLの環境構築(3/6) • OpenCL SDKの入手 – AMD社:AMD APP SDK • http://developer.amd.com/appsdk – NVIDIA社:CUDA Toolkit, Parallel Nsight • http://developer.nvidia.com/cuda-toolkit • http://developer.nvidia.com/nvidia-parallel-nsight – Intel社:Intel OpenCL SDK • http://www.intel.com/go/opencl – Apple社:OSに付属(MacOS X 10.6以降) • /System/Library/Frameworks/OpenCL.framework わんくま同盟 名古屋勉強会 #19
  • 17. 2. OpenCLの環境構築(4/6) • 各SDKの特徴(1/2) ※Macは割愛 Visual オフライン その他 C++ デバッガ SDK名称 Studio コンパイラ ツール 対応 付属 対応 付属 付属 AMD APP SDK (Accelerated Parallel Processing) ○ × × ○ ○ CUDA Toolkit × × × ○ ○ Parallel Nsight (CUDA Toolkit+α) × ○ ○ ○ ○ Intel OpenCL SDK ○ × × ○ × わんくま同盟 名古屋勉強会 #19
  • 18. 2. OpenCLの環境構築(5/6) • 各SDKの特徴(2/2) ※Macは割愛 H/Wなし GPU CPU SDK名称 のインス - - 実行 実行 トール AMD APP SDK (Accelerated Parallel Processing) ○ ○ ○ - - CUDA Toolkit ○ ○ ○ - - Parallel Nsight (CUDA Toolkit+α) ○ ○ ○ - - Intel OpenCL SDK × × ○ - - わんくま同盟 名古屋勉強会 #19
  • 19. 2. OpenCLの環境構築(6/6) • インストール先情報 – AMD APP SDK v2.5 • include : %ProgramFiles(x86)%¥AMD APP¥ • sample : %UserProfile%¥My Documents¥AMD APP¥ – Parallel Nsight v2.0 • include : %ProgramFiles%¥NVIDIA GPU Computing Toolkit¥CUDA¥v4.0¥ • sample : %ProgramFiles(x86)%¥NVIDIA Parallel Nsight 2.0¥Samples¥ – Intel OpenCL SDK v1.5 • include : %ProgramFiles(x86)%¥Intel¥OpenCL SDK¥1.1¥ • sample : %SystemDrive%¥Users¥Public¥Documents¥Intel¥O penCL SDK¥1.1¥ わんくま同盟 名古屋勉強会 #19
  • 20. 3. OpenCLの構造 1. OpenCLとは 2. OpenCLの環境構築 3. OpenCLの構造 4. OpenCLを使ったデモ 5. まとめ わんくま同盟 名古屋勉強会 #19
  • 21. 3. OpenCLの構造(1/14) • OpenCLデバイスのイメージ OpenCLデバイス – OpenCLデバイスは1つ以上の CU 計算ユニット(CU:Computation PE PE ・・・ Unit)を持つ。 – 計算ユニットは1つ以上の処理 CU エレメント(PE:Processing PE PE ・・・ Unit)で構成される。 – これらのユニットをどのように CU 使うかは実装者が指示するか PE PE ・・・ OpenCLに任せる事も可能。 わんくま同盟 名古屋勉強会 #19
  • 22. 3. OpenCLの構造(2/14) • 処理の流れ(1/2) 1. ホストプログラム起動 2. デバイスハンドル取得 3. コマンドキュー作成 4. カーネルプログラムをメモリ上に読み込み 5. プログラムオブジェクト作成 6. カーネルオブジェクト作成 7. カーネルオブジェクトをコマンドキューに登録 8. コマンドキューから実行結果を取り出す わんくま同盟 名古屋勉強会 #19
  • 23. 3. OpenCLの構造(3/14) • 処理の流れ(2/2) 8. メモリ オブジェクト 3. コマンド 6. カーネル キュー 7. 登録 オブジェクト 5. プログラム 2. デバイス オブジェクト 1. ホスト 4. カーネル プログラム プログラム わんくま同盟 名古屋勉強会 #19
  • 24. 3. OpenCLの構造(4/14) • OpenCLのAPI(1/11) – システムで利用可能なPlatformのIDを取得 cl_int clGetPlatformIDs( cl_uint /* num_entries */, cl_platform_id * /* platforms */, cl_uint * /* num_platforms */ ); わんくま同盟 名古屋勉強会 #19
  • 25. 3. OpenCLの構造(5/14) • OpenCLのAPI(2/11) – Platformに含まれるデバイスIDのリストを返す cl_int clGetDeviceIDs( cl_platform_id /* platform */, cl_device_type /* device_type */, cl_uint /* num_entries */, cl_device_id * /* devices */, cl_uint * /* num_devices */ ); わんくま同盟 名古屋勉強会 #19
  • 26. 3. OpenCLの構造(6/14) • OpenCLのAPI(3/11) – デバイスを指定してコンテキストを作成 cl_context clCreateContext( const cl_context_properties * /* properties */, cl_uint /* num_devices */, const cl_device_id * /* devices */, void (CL_CALLBACK * /* pfn_notify */)( const char *, const void *, size_t, void *), void * /* user_data */, cl_int * /* errcode_ret */ ); わんくま同盟 名古屋勉強会 #19
  • 27. 3. OpenCLの構造(7/14) • OpenCLのAPI(4/11) – 与えられたコンテキスト・デバイス用のキューを作 成 cl_command_queue clCreateCommandQueue( cl_context /* context */, cl_device_id /* device */, cl_command_queue_properties /* properties */, cl_int * /* errcode_ret */ ); わんくま同盟 名古屋勉強会 #19
  • 28. 3. OpenCLの構造(8/14) • OpenCLのAPI(5/11) – バッファメモリオブジェクトを作成 cl_mem clCreateBuffer( cl_context /* context */, cl_mem_flags /* flags */, size_t /* size */, void * /* host_ptr */, cl_int * /* errcode_ret */ ); わんくま同盟 名古屋勉強会 #19
  • 29. 3. OpenCLの構造(9/14) • OpenCLのAPI(6/11) – カーネルのソースコードからプログラムオブジェク トを作成 cl_program clCreateProgramWithSource( cl_context /* context */, cl_uint /* count */, const char ** /* strings */, const size_t * /* lengths */, cl_int * /* errcode_ret */ ); わんくま同盟 名古屋勉強会 #19
  • 30. 3. OpenCLの構造(10/14) • OpenCLのAPI(7/11) – 指定されたプログラムオブジェクトをビルド cl_int clBuildProgram( cl_program /* program */, cl_uint /* num_devices */, const cl_device_id * /* device_list */, const char * /* options */, void (CL_CALLBACK * /* pfn_notify */)( cl_program, void * ), void * /* user_data */ ); わんくま同盟 名古屋勉強会 #19
  • 31. 3. OpenCLの構造(11/14) • OpenCLのAPI(8/11) – ビルドしたプログラムオブジェクトからカーネルを 作成する cl_kernel clCreateKernel( cl_program /* program */, const char * /* kernel_name */, cl_int * /* errcode_ret */ ); わんくま同盟 名古屋勉強会 #19
  • 32. 3. OpenCLの構造(12/14) • OpenCLのAPI(9/11) – カーネルの引数をセットする cl_int clSetKernelArg( cl_kernel /* kernel */, cl_uint /* arg_index */, size_t /* arg_size */, const void * /* arg_value */ ); わんくま同盟 名古屋勉強会 #19
  • 33. 3. OpenCLの構造(13/14) • OpenCLのAPI(10/11) – カーネルを実行する為のコマンドをキューに登録 cl_int clEnqueueTask( cl_command_queue/* command_queue */, cl_kernel /* kernel */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ); わんくま同盟 名古屋勉強会 #19
  • 34. 3. OpenCLの構造(14/14) • OpenCLのAPI(11/11) – バッファオブジェクトからデータを読み込む為のコ マンドをキューに登録 cl_int clEnqueueReadBuffer( cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_read */, size_t /* offset */, size_t /* cb */, void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */ ); わんくま同盟 名古屋勉強会 #19
  • 35. Agenda 1. OpenCLとは 2. OpenCLの環境構築 3. OpenCLの構造 4. OpenCLを使ったデモ 5. まとめ わんくま同盟 名古屋勉強会 #19
  • 36. 5. OpenCLを使ったデモ • 何かデモする わんくま同盟 名古屋勉強会 #19
  • 37. 5.まとめ 1. OpenCLとは 2. OpenCLの環境構築 3. OpenCLの構造 4. OpenCLを使ったデモ 5. まとめ わんくま同盟 名古屋勉強会 #19
  • 38. 5. まとめ • OpenCLが出てきた背景や今後について話を しました。 • ホスト側の制御処理が統一されるのは嬉しい。 • デバイス側はデバイスによる機能サポートに よって制限をうけるが汎用的に使えるのは嬉 しい。 • 但し、あるデバイスの性能をフルに活かすに はやはり専用APIを使うのが一番速い。 わんくま同盟 名古屋勉強会 #19
  • 39. 参考情報等 • OpenCL入門 - マルチコアCPU・GPUのため の並列プログラミング – ISBN:9784844328148, インプレスジャパン • OpenCL入門 - GPU&マルチコアCPU並列 プログラミング – ISBN:9784798026084, 秀和システム わんくま同盟 名古屋勉強会 #19