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