1.名词:
- 加速比(Obscrved Speedup):
- 并行开销(Parallel overhead):
- 可拓展性(Scalability )
2.并行编程模型:
- 共享存储模型
- 线程模型
- 消息传递模型
- 数据并行模型
3.OpenCL:
- OpenCL(Open Computing Langugae)是一种开放运算语言,是第一个面向异构系统(系统由CPU,GPU或其它类型的处理器架构组成)的并行编程的开放式标准,可跨平台。
- OpenCL:一是用于编写kernels(在OpenCL设备上运行的函数)的语言;二是用于定义并控制平台的API(函数)
- OpenCL提供了基于任务和基于数据两种并行计算机制。
- OpenCL是一种标准,NVDIA中将OpenCL实现集成到它的CUDA SDK。
- 架构:OpenCL平台API;OpenCL运行时API;OpenCL编程语言
- OpenCL平台组成:宿主机和OpenCL设备
4.编写OpenCL程序的基本步骤
- 1)获取平台–>clGetPlatformIDs
- 2)从平台中获取设备–>clGetDeviceIDs
- 3)创建上下文–>clCreateContext
- 4)创建命令队列–>clCreateCommandQueue
- 5)创建缓存->clCreateBuffer
- 6)读取程序文件,创建程序–>clCreateProgramWithSource
- 7)编译程序–>clBuildProgram
- 8)创建内核–>clCreateKernel
- 9)为内核设置参数–>clSetKernelArg
- 10)将内核发送给命令队列,执行内核–>clEnqueueNDRangeKernel
- 11)获取计算结果–>clEnqueueReadBuffer
- 12)释放资源–>clReleaseXX**
5.编写OpenCL程序的基本步骤
1)载入opencl库(这种方法可使得程序在编译时脱离OpenCL库)
- handel = dlopen("dlOpenCL.so",其他参数); //打开so共享库
- dlsym(handel, #func_name) //注册库内部的函数
2)检测申请计算资源(初始化,一般只需要执行一次)
- 获取平台 –> clGetPlatformIDs //先获取平台数量,再获取平台id列表
- 从平台获取设备–>clGetDeviceIDs //先获取设备数量,再获取设备id列表 clGetDeviceInfo //获取设备信息(名字版本最大计算单元全局内存缓冲区大小等信息)
- 创建上下文 –> clCreateContext
- 创建命令队列–> clCreateCommandQueue前面为 平台层,后面为 运行时层
- 创建缓存->clCreateBuffer
3)拷贝主机数据到设备device clCreateBuffer
4)opencl程序编译
- 读取程序文件,创建程序–>clCreateProgramWithSource
- 编译程序–>clBuildProgram
- 创建内核–>clCreateKernel
- 为内核设置参数–>clSetKernelArg
- 设置 NDRange
5)运行kernel函数
- 将内核发送给命令队列,执行内核–>clEnqueueNDRangeKernel
6)拷贝设备上的计算结果到主机
- 获取计算结果–>clEnqueueReadBuffer
7)释放计算资源
- 释放资源–>clReleaseXX**
释放kernel核, clReleaseKernel
释放program编译程序, clReleaseProgram
释放device memory设备内存, clReleaseMemObject
释放command queue指令队列, clReleaseCommandQueue
释放context上下文环境, clReleaseContext