Brook+ Programming (1)

本文介绍了Brook+编程语言的基础知识,包括与C/C++语言的相似之处及区别,重点讲解了Kernel函数的概念及其如何应用于流处理器上,同时对流(Streams)的声明和操作进行了详细的说明。

 (接上一篇文章)

      Brook+的代码和C/C++的很像,但要注意以下几点:

      第一,brcc像C编译器一样工作,也就是说编程要坚持标准C规范(例如:变量在代码段前声明)。

      对于更复杂的应用,要小心地区分C代码和Brook+代码以使其可组织、可使用。因此,函数可以被声明,然后从C/C++代码文件中调用,

而不是直接放在main函数里面。

 

      2.2.1.1 Kernels

 

      对于前面的例子,注意到kernel函数:

 

     kernel void sum(float a<>,float b<>,out float c<>)

     {

           c = a + b;

      }

      .  .  .

      sum(a,b,c);

 

      Kernel函数是运行于流处理器上的。kernel函数作用于流的每个元素(原文:The kenerl is invoked on every element of the stream)。

Kernel函数通过调用他们而被执行,就像有参数的C中的函数一样。

     Kernel函数像C中的函数一样,但是有一些扩展和限制(参见Brook+ 语言特性的完全列表).接下来的例子中,a和b是输入流,c是输出流。流在Brook+里面是用尖括号表示的。在这种约定下,API自动地定位流。

 

      2.2.1.2 Streams

 

      在上例中,

 

       float     a<10,10>;

       float     b<10,10>;

       float     c<10,10>;

 

       流通过这种尖括号的形式被声明(而不是C/C++中的方括号).硬件本身最多只支持大小为8192的一维数组和8192x8192的二维数组,其中的每个元素为流类型(例如:float4。注:float4指四维的浮点向量)。更高位数的和更大尺度的流通过地址虚拟技术在编译时实现(很可能影响性能)。例如,一个一维的数组可以被虚拟为包含8192x8192个元素。允许使用地址虚拟化技术的详情参见2.2.2节“生成”,更多细节参见Brook+ 语言特性。

 

      2.2.1.3 Handling Streams

 

      从上例:

      streamRead(a,input_a);

      streamRead(b,,input_b);

      .    .    .

      streamRead(c,input_c);

 

      流不能被直接操纵。数据在流和内存之间的交换必须通过streamRead()和streamWrite()两个函数:

      streamRead(stream*  ,void  *);

      streamWrite(stream  *,void  *);

 

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值