文件名称:节介绍的OpenCL内存模型-android官方培训课程中文版v0.9.7
文件大小:5.1MB
文件格式:PDF
更新时间:2024-06-27 13:55:49
OpenCL
第三章 OpenCL编程
33
o�set)的情况下就和创建该 bu�er对象时所使用的host内存指针相同,在上面的例子中就是这种情
况,即 outbu�er与hostmap一定为同一指针。
必须要注意的是当用户使用clEnqueueMapBu�er进行写(CL_MAP_WRITE)操作时,必须在相
对应的 clEnqueueUnmapMemObject函数执行完毕之后才能视为映射写操作已经完成,在此过程中
kernel是禁止读 /写该 bu�er对象的。相对而言,在用户使用 clEnqueueMapBu�er进行读(CL_MAP_
READ)操作的过程中,kernel可以同时读取该 bu�er,当然在 kernel中写该 bu�er是被禁止的。同样道
理在 bu�er被映射的过程中,用户是不可以对该 bu�er进行写操作的(clEnqueueWriteBu�er)
3.5 OpenCL内核模块
这一节介绍 OpenCL C程序语言的使用方法。OpenCL C程序语言简称OpenCL C是用来编写运行
在 OpenCL设备上的 kernel程序的一门语言。OpenCL C基于 ISO/IEC 9899:1999 C(以下简称 C)标准
做了一定的扩展和限制。关于 C标准读者可以参考相关文档,本节只着重介绍 OpenCL C对C标准的扩
展和限制。
还是hellocl中的kernel函数作为入门,
首先 OpenCL C比C多出了一些函数限定符,在本例中到了 __kernel(可简写为 kernel),这也是所
有 OpenCL C中必须用到的。函数加注 __kernel表示其只能运行于 OpenCL设备上,并且该函数可以被
host调用,kernel中的其它函数也可以像调用普通函数一样调用含有该前缀的函数。
其次 OpenCL C增加了一些地址空间限定符包括 __global,__local,__constant和 __private。这
些地址限定符可以用来声明变量,以表明该变量对象所使用的内存区域。以上述地址空间限定符声明
的对象会被分配到指定地址空间,否者会被分配到通用地址空间。
对应于2.3节介绍的OpenCL内存模型
__global或简写为 global,表示该声明内存对像使用的是从全局内存空间分配出来的内存,工作
空间内所有工作节点都可以读 /写这块被声明的内存。在上面的例子中 bu�er就被加注了global限定符,
所以 kernel内部可以*访问bu�er。
__constant或简写为 constant,与 global相同,使用从全局内存空间分配出来的内存,可以在所有
1 __kernel void hel locl ( __global uint * buffer ) {
2 size_t gidx = get_global_id (0) ;
3 s ize_t gidy = get_global_id (1) ;
4 buffer [( gidx +4* gidy ) ]=((1<< gidx ) |(0 x10 <