opencl
2024/10/3大约 3 分钟
opencl
配置
intel GPU
windows
- intel opencl资源文档显示opencl运行时已在window版gpu驱动包中
- 在官网下载中心下载同显卡型号的最新驱动
- 如果需要进行编译还需要下载oneAPI 编译工具
- 目前oneAPI安装后库文件存放在
C:\Program Files (x86)\Intel\oneAPI\compiler\2024.2\lib,头文件存放在C:\Program Files (x86)\Intel\oneAPI\compiler\2024.2\include,目前无自定义安装
C
opencl使用
opencl的封装库
CLBlast
CLBlast是一个轻量级、高性能并可调优的C++11编写的OpenCL BLAS库。它设计用于充分利用来自不同厂商的多种OpenCL设备的性能潜力,包括桌面和笔记本GPU、嵌入式GPU以及其他加速器。该库实现了BLAS子程序,即操作向量和矩阵的基本线性代数程序,仓库在githubCLBlast还提供c版本调用,具体api可查看仓库中doc/api.md文件
- 矩阵运算常用参数及含义
// 告诉在opencl中使用的是按行存储还是按列存储
// CLBlastLayoutRowMajor(按行存储) CLBlastLayoutColMajor(按列存储)
const CLBlastLayout layout
// 是否需要进行矩阵转置后进行运算,a、b两个矩阵各一个
const CLBlastTranspose a_transpose
// 传入的单次矩阵运算大小,a的大小为m*k,b的大小为k*n
const size_t m, const size_t n, const size_t k
// 矩阵运算的放大倍数,C = alpha*AB + beta*C
// 允许基本类型和cl类型的多种输入,c++版本利用了模板,c版本请选择对应的计算函数
alpha, beta
// 对应需要计算的buffer
const cl_mem a_buffer
// 本次运算的偏移量,比如a是自偏移量起取m*k大小的数据计算
const size_t a_offset
// ld即leading dimension是单次计算的矩阵的主维度
// 如果是按行存储,提供的是矩阵有多少列(每行有几个)
// 如果是按列存储,提供的是矩阵有多少行(每列有几个)
// ld可能和矩阵大小直接相关,但传入的矩阵可能只是大矩阵的一个子矩阵,或使用了其他存储结构,这个值和计算矩阵的存储结构有关
const size_t a_ld
// 其他参数
cl_command_queue *queue
cl_event *eventCLBlastSgemm计算矩阵乘法,对应c++模板函数为Gemm
CLBlastStatusCode CLBlastSgemm(const CLBlastLayout layout, const CLBlastTranspose a_transpose, const CLBlastTranspose b_transpose,
const size_t m, const size_t n, const size_t k,
const float alpha,
const cl_mem a_buffer, const size_t a_offset, const size_t a_ld,
const cl_mem b_buffer, const size_t b_offset, const size_t b_ld,
const float beta,
cl_mem c_buffer, const size_t c_offset, const size_t c_ld,
cl_command_queue* queue, cl_event* event);
// 参数在前面主要参数中已经介绍过了,此方法会将传入的矩阵一次性计算完成
// 如果希望使用double类型应该使用CLBlastDgemmCLBlastSgemmBatched批量计算同大小矩阵乘法,对应c++模板函数为GemmBatched
// 参数与非批量版不同,offset、alpha和beta变成了数组,即每批计算时使用的值是分开的,但ld和m、n、k并未分开,只能批量计算相同大小尺寸的矩阵
CLBlastStatusCode CLBlastSgemmBatched(const CLBlastLayout layout, const CLBlastTranspose a_transpose, const CLBlastTranspose b_transpose,
const size_t m, const size_t n, const size_t k,
const float *alphas,
const cl_mem a_buffer, const size_t *a_offsets, const size_t a_ld,
const cl_mem b_buffer, const size_t *b_offsets, const size_t b_ld,
const float *betas,
cl_mem c_buffer, const size_t *c_offsets, const size_t c_ld,
const size_t batch_count,
cl_command_queue* queue, cl_event* event);CLBlastSgemmStridedBatched批量计算相同大小相同步长的矩阵乘法,使用多重strided特别优化,对应c++模板函数为GemmStridedBatched
// 参数与非批量版不同之处为,添加了计算参数和每次偏移的步长参数,只能批量计算相同大小尺寸且步长固定的连续存储的矩阵,效果比CLBlastSgemmBatched好
CLBlastStatusCode CLBlastSgemmStridedBatched(const CLBlastLayout layout, const CLBlastTranspose a_transpose, const CLBlastTranspose b_transpose,
const size_t m, const size_t n, const size_t k,
const float alpha,
const cl_mem a_buffer, const size_t a_offset, const size_t a_ld, const size_t a_stride,
const cl_mem b_buffer, const size_t b_offset, const size_t b_ld, const size_t b_stride,
const float beta,
cl_mem c_buffer, const size_t c_offset, const size_t c_ld, const size_t c_stride,
const size_t batch_count,
cl_command_queue* queue, cl_event* event)