Published

22 July 2013

Tags

Contents

本文介绍opencl一些限定符的运用

kernel内核限定符

  • 返回值必须是void
  • 参数的一些限制,不能是私有。

内核属性限定符

地址空间限定符

如果没有加限定符,则默认为private。

由不同限定符限定的指针之间不能转换。

  • global

全局地址空间限定符,表示指向的地址空间为全局公用的。

  • constant

全局常量地址空间限定符,相当于只读全局地址空间,只有constant可以声明在全局变量里,如下。

  global long4 g;    // illegal
  private int x;     // illegal
  local int p;       // illegal
  constant int y;    // legal
   
  kernel void kernelMain(global int *p) {
    ...
  }
  • local

局部地址空间限定符,trick最多的一种类型,因为显卡局部显存和全局显存速度的差异性,导致这么一种东西的诞生。

  • 不允许初始化,注意:由local限定的指针可以初始化
  • 只允许申请在内核函数的最外层声明,指针可以随意申请
  • 不能由宿主程序赋值。

  • private

最正常的限定符,类似于平时写串行程序的变量。

访问限定符

  • write_only
  • read_only

另外,opencl不支持任何形式的new,也就是说他所有空间都是静态的,所以递归什么的也是不行的,这个挺让人捉急的…

由于本人水平有限,刚开始初学,所以内容也许有错误,欢迎批评指正。



blog comments powered by Disqus