opencl总结

函数:

clGetPlatformIDs
clGetDeviceIDs
clCreateContext
clCreateCommandQueue,命令队列连接上下文与设备
clCreateBuffer,创建一维buffer类型的内存对象 ,也可以指定一个主机的对象作为内存对象的拷贝。image是多维的buffer对象,不可同时可读可写。
clEnqueueWrite(Buffer),从主机向设备写入内存对象,内存对象就是设备上的数据
clEnqueueRead(Buffer),从设备向主机读入内存对象
clCreateProgramWithSource,创建程序对象。程序对象:在设备上编译kernel生成的opencl对象
clBuildProgram,编译程序对象
clBuildProgram,从文件中读取源代码串的函数
clGetProgramBuildInfo,得到编译是否成功的消息
clCreateKernel,创建kernel对象。kernel对象:kernel函数及相关参数
clSetKernelArg,重新为kernel设置参数以再次运行
get_global_id,得到global id,column = get_global_id(0), row = get_global_id(1)
get_global_size,?
get_group_id,group相当于cuda中的block
get_num_group,get_num_groups(0) * get_local_size(0) == get_global_size(0)
get_local_id,得到local id,根据global id和local id可以定位一个thread
get_local_size
clEnqueueNDRangeKernel,把kernel放入队列,但不马上执行。每个线程的代码相同,数据不同。simd
clReleaseProgram,clReleaseMemObject,释放资源
clGetEventProfilingInfo,记录事件时间

内存对象地址空间标识符:

__global, shared among all groups(blocks)
__constant
__local, shared in group(block)
__private, privated per work item(thread)
__read_only || __write_only,used for images
kernel函数如果是内存对象 ,则一定是global/local/constant

错误捕捉:

CL_DEVICE_NOT_FOUND -1
CL_DEVICE_NOT_AVAILABLE -2
CL_COMPILER_NOT_AVAILABLE -3
CL_MEM_OBJECT_ALLOCATION_FAILURE -4

流程
. 创建 platform 对象
. 创建 GPU 设备
创建 contex
创建命令队列
创建缓冲对象
创建程序对象
编译程序对象
创建 Kernel 对象
设置 kernel 参数
执行 kernel
数据拷贝回 host memory,我采用映射 memory 的方式。

coalesced内存访问
在 HD5870 显卡中,一个 wave 中 16 个连续线程的内存访问会被合并,称作 quarter-wavefront,是重要的硬件调度单位。 cuda中的war,wave中有64个线程

work group相当于cuda中的block,work item相当于thread

在 OpenCL 中,Kernel 函数被 workgroup 中的 workitem(线程,我可能混用这两个概念)执行。在硬件层次,workgroup 被映射到硬件的 cu compute unit)
(单元来执行具体计算, cu 一般由更多的 SIMT而(单指令,线程)pe(processing elements)组成。这些 pe 执行具体的 workitem 计算,它们执行同样的指令,但操作的数据不一样, simd用的方式完成最终的计算。
work item 与 pe 的关系,workgorup 与 cu 关系?

Occupancy,warp中活动的线程数量(受local memory 和 register数量限制),数量越多延时越能被掩盖

硬件系统有一个 64 位 mask 寄存器,第一次是它为 01...0101, 第二次会进行反转操作 10...1010,根据mask 寄存器的置位情况,来选择执行不同的线程。

向量化允许一个线程同时执行多个操作

你可能感兴趣的:(open)