现在的位置: 首页 > 综合 > 正文

OpenCL: OpenCL的shader

2013年10月07日 ⁄ 综合 ⁄ 共 2685字 ⁄ 字号 评论关闭

工作之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下函数类型

      这里介绍关于OpenCL中program函数的写法,program函数通常是文本形式的,然后应用clCreateProgramWithSource这样的接口load进来。在Shader编程中也经常应用这种形式书写GPU上运行的代码,所以为了表述清楚和懂得方便,这里姑且把这些program函数的源码文本称为OpenCL的shader吧

 上面都是写在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,后一半为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即是对每一个元素分别计算

 

    

 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间的交互

    

            一个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。

http://www.cnblogs.com/jisi5789/archive/2013/05/22/3093354.html

抱歉!评论已关闭.