Open3

【メモ】OpenCL APIをC++で触ってみる

imori13imori13

触るに至った経緯

CPU負荷の高い部分をマルチスレッド化やベクトル演算を使用して処理負荷を減らそうとしていた

→ GPU内蔵型プロセッサを使用する選択肢が取れれば良いなと思った

→ 僕が知っているGPUのハードウェアを扱う手段として、描画APIのDirectXやVulkanなどでシェーダーを書くことしか知らなかった

→ 描画APIはグラフィックス向けにパイプラインが組まれているので、ただGPUを触りたい場合に最適な手段ではないと思ったので、GPUを直接扱う方法を探していた。

→ OpenCLを知ったので触る

openclのインストール

windows環境vcpkgで入力

.\vcpkg install opencl:x64-windows
.\vcpkg integrate install

これでopenclをインクルードして使える
CUDAの場合はToolKitが必要か?

#include <CL/opencl.hpp> // C++でラップされたヘッダがある

cl.hはC言語インターフェースを提供するもので、
リソース管理を自分で行う必要があるみたい(?)

C++で扱いたい場合はopencl.hppを使ったほうがいいかも

imori13imori13

こちらで公開されているサンプルコードを実行してみた。
https://medium.com/@ravi.kaskuser/writing-c-opencl-program-on-amd-graphics-card-using-visual-studio-code-on-windows-66142553cf07

出力結果

ノートPC
NVIDIA GeForce RTX 3070 Laptop GPU

Menggunakan 1 platform hardware
Nama Platform: NVIDIA CUDA
Vendor: NVIDIA Corporation
Versi Platform: OpenCL 3.0 CUDA 12.3.68
  Nama Perangkat: NVIDIA GeForce RTX 3070 Laptop GPU
  Vendor Perangkat: NVIDIA Corporation
  Versi Driver: 546.12
  Jumlah Core: 40
  Ukuran Memori: 8191MB

-------------------------
Masukkan ukuran buffer: 2048
Menggunakan Buffer Size: 2048
menghitung...

Time taken for matrix multiplication on CPU: 22.6142 seconds
Time taken for matrix multiplication on multi-core CPU: 3.95501 seconds
Time taken for matrix multiplication on GPU: 0.076447 seconds
Speedup time for GPU vs Single Threaded CPU: 295.815x
Speedup time for GPU vs Multi Threaded CPU: 51.7353x

ミニPC
CPU AMDのRadeon Vega 8

Menggunakan 1 platform hardware
Nama Platform: AMD Accelerated Parallel Processing
Vendor: Advanced Micro Devices, Inc.
Versi Platform: OpenCL 2.1 AMD-APP (3444.0)
  Nama Perangkat: gfx902
  Vendor Perangkat: Advanced Micro Devices, Inc.
  Versi Driver: 3444.0 (PAL,HSAIL)
  Jumlah Core: 10
  Ukuran Memori: 4142MB

-------------------------
Masukkan ukuran buffer: 2048
Menggunakan Buffer Size: 2048
menghitung...

Time taken for matrix multiplication on CPU: 88.6658 seconds
Time taken for matrix multiplication on multi-core CPU: 37.0929 seconds
Time taken for matrix multiplication on GPU: 0.98858 seconds
Speedup time for GPU vs Single Threaded CPU: 89.69x
Speedup time for GPU vs Multi Threaded CPU: 37.5214x