初学习opencl
2014-12-23 10:06
369 查看
这里介绍关于OpenCL中program函数的写法,program函数通常是文本形式的,然后使用clCreateProgramWithSource这样的接口load进来。在Shader编程中也经常使用这种形式书写GPU上运行的代码,所以为了表述清楚和理解方便,这里姑且把这些program函数的源码文本称为OpenCL的shader吧
下面都是写在shader中的一些语法
不支持:
头文件、函数指针、递归、变长数组(这个VS也不支持)
额外加入的类型:
vector 类型 char2 ushaort4 int8 这些最后都会变成长度对齐的
图像类型 image2d_t image3d_t sampler_t ...
event类型 event_t(关联于API中CL_event)
![](https://img-blog.csdn.net/20130521180852386)
vector的前一半为lo,后一半为hi
int4 v=(int4) 7 =(int4)(7,7,7,7)
v=(in4)(1,2,3,4)
int2 v2=v.lo ->(1,2)
v2=v.hi ->(3,4)
v2.v.odd ->(2,4)
对vector做四则运算、abs等于对每个元素分别计算
__global
__local
__private
__constant
这四个分别对应了CL架构中的存储区域(设备全局、work group、compute unit 、设备constant)
前面的__也可去掉
目前global一定是constant的,也就是声明global时必须赋值 (global就等于 global constant)
不同地址空间上的指针转化是没有定义的
5.1convert类型转换;这是按照变量语意的类型转换
写成convert_destType<_sat><_roundingMode>形式,
如float4 f4=(float4)(1.0f,2.0f,3.0f,4.0f)
int4 i4=convert_int4_sat_rte(f4)
destType:目标类型
_sat:超出范围自动归结为最大或最小显示的数
_roundingMode:
_rte:表示成最接近的偶数
_rtz:朝0接近
_rtp:朝正无穷大
_rtn:朝负无穷大
这里面的规则比较复杂,详见http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/convert_T.html
5.2 as转换:这是根据bit值重新解释的类型转换
写成as_desttype
其中转换前后的类型的vetctor size是要一样的,desttype是目标类型,这个转换会保持bit值不变,在此基础上根据desttype重新解释数值
as转换和convert转换有着本质的区别!
如float4 f4=(float4)(1.0f,2.0f,3.0f,4.0f)
int4 i4=as_int4(f4)
6.1各种各样超多的数学函数
贴个简表
![](https://img-blog.csdn.net/20130522115524341)
6.2Work_group函数:
主要用于一个group内的computer item间的交互
同步函数
一个goup内的所有item必须全部执行完这个barrier函数之后才能继续进行后续的事情,也可看做这是所有item的一个同步点,不管谁快谁慢,必须到这个点停一下,大家都到了这个点之后,再继续进行。
这里的参数分两种情况:
CLK_LOCAL_MEM_FENCE和CLK_GLOBAL_MEM_FENCE
这个参数我现在也没搞得很懂,大意是加入一个mem fence保证这时loca mem或者globalmem 的同步正常,关于mem fence 的概念还要再看看opencl的描述
异步的内存copy和prefetch函数
async_work_group_copy:他会完成global与local之间的异步的内存拷贝,这种拷贝可能会使用DMA 引擎的(DMA的数据传输不使用传统的硬件中断,会很快),这个函数是异步的,所以会返回一个事件event_t用于同步
使用wait_group_events函数来等待上面的event返回,用于同步
async_work_group_strided_copy:文档上说它用于gather数据从src到dest,但是文档中gather的意思不能让人很好的理解,仔细的分析一下,这个函数同 async_work_group_copy的差异在于stride,他也是完成异步的拷贝,但是它可以从src抽取一部分域出来到dst中。例如在图形学中我们经常用一个大数组表示颜色、法向、纹理坐标等等,他们是连在一起的,如{color1,ccolor2,color3,tex0,tex1,color1,color2,color3,text0,tex1,....},这时我们需要抽取其中的color信息出来,那就要用到这个stride
copy。
下面都是写在shader中的一些语法
1 shader是类C的语言,派生自C99标准(99年ansi C接受的标准,也是C最新的标准)
不支持:头文件、函数指针、递归、变长数组(这个VS也不支持)
额外加入的类型:
vector 类型 char2 ushaort4 int8 这些最后都会变成长度对齐的
图像类型 image2d_t image3d_t sampler_t ...
event类型 event_t(关联于API中CL_event)
2.work item和 work Group相关函数
3.vector 操作
vector的前一半为lo,后一半为hiint4 v=(int4) 7 =(int4)(7,7,7,7)
v=(in4)(1,2,3,4)
int2 v2=v.lo ->(1,2)
v2=v.hi ->(3,4)
v2.v.odd ->(2,4)
对vector做四则运算、abs等于对每个元素分别计算
4.寻址空间描述符,写在变量的最前面,用于变量所处于的地址空间
__global__local
__private
__constant
这四个分别对应了CL架构中的存储区域(设备全局、work group、compute unit 、设备constant)
前面的__也可去掉
目前global一定是constant的,也就是声明global时必须赋值 (global就等于 global constant)
不同地址空间上的指针转化是没有定义的
5.类型转换
5.1convert类型转换;这是按照变量语意的类型转换写成convert_destType<_sat><_roundingMode>形式,
如float4 f4=(float4)(1.0f,2.0f,3.0f,4.0f)
int4 i4=convert_int4_sat_rte(f4)
destType:目标类型
_sat:超出范围自动归结为最大或最小显示的数
_roundingMode:
_rte:表示成最接近的偶数
_rtz:朝0接近
_rtp:朝正无穷大
_rtn:朝负无穷大
这里面的规则比较复杂,详见http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/convert_T.html
5.2 as转换:这是根据bit值重新解释的类型转换
写成as_desttype
其中转换前后的类型的vetctor size是要一样的,desttype是目标类型,这个转换会保持bit值不变,在此基础上根据desttype重新解释数值
as转换和convert转换有着本质的区别!
如float4 f4=(float4)(1.0f,2.0f,3.0f,4.0f)
int4 i4=as_int4(f4)
6.内建函数:
6.1各种各样超多的数学函数:详见http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/的Built_in Function一节
贴个简表
6.2Work_group函数:
主要用于一个group内的computer item间的交互
同步函数
void barrier ( | cl_mem_fence_flags flags) |
这里的参数分两种情况:
CLK_LOCAL_MEM_FENCE和CLK_GLOBAL_MEM_FENCE
这个参数我现在也没搞得很懂,大意是加入一个mem fence保证这时loca mem或者globalmem 的同步正常,关于mem fence 的概念还要再看看opencl的描述
异步的内存copy和prefetch函数
async_work_group_copy:他会完成global与local之间的异步的内存拷贝,这种拷贝可能会使用DMA 引擎的(DMA的数据传输不使用传统的硬件中断,会很快),这个函数是异步的,所以会返回一个事件event_t用于同步
使用wait_group_events函数来等待上面的event返回,用于同步
async_work_group_strided_copy:文档上说它用于gather数据从src到dest,但是文档中gather的意思不能让人很好的理解,仔细的分析一下,这个函数同 async_work_group_copy的差异在于stride,他也是完成异步的拷贝,但是它可以从src抽取一部分域出来到dst中。例如在图形学中我们经常用一个大数组表示颜色、法向、纹理坐标等等,他们是连在一起的,如{color1,ccolor2,color3,tex0,tex1,color1,color2,color3,text0,tex1,....},这时我们需要抽取其中的color信息出来,那就要用到这个stride
copy。
相关文章推荐
- OpenCL 学习step by step (7) 灰度图Histogram计算(1)
- OpenCL 学习step by step (1) 安装AMD OpenCL APP
- OpenCL开发案例学习
- OpenCL学习笔记(1)
- opencl学习(四)
- OpenCL 学习step by step (2) 一个简单的OpenCL的程序
- OpenCL开发案例学习
- 从零开始学习OpenCL开发(三)深入API
- opencl初学笔记--环境配置+推荐学习网址
- OpenCL 学习step by step (2) 一个简单的OpenCL的程序
- 我的OpenCL学习之路(1)——在VS2010中配置OpenCL工程
- 我的OpenCL学习之路(3)有关get_global/local_id/size
- OpenCL学习博客
- OpenCL 学习step by step (10) 矩阵转置
- OpenCL 学习step by step (3) 存储kernel文件为二进制
- OpenCL 学习step by step (5) 使用二维NDRange workgroup
- OpenCL 学习step by step (9) 灰度图Histogram计算(3)
- 从零开始学习OpenCL开发(一)架构
- opencl学习(二)
- OpenCL: 从零开始学习OpenCL开发