OpenCL学习笔记(5)--映射和解映射

1.主机使用函数clSetKernelArg将内存对象发送给设备,完成设备到主机的数据传输最为简单的函数是调用函数clEnqueueReadBuffer。每个函数都包含一个名为blocking的布尔型变量,如果它的值为CL_TRUE,这个函数在完成读写操作之前都不会返回。如果它的值为CL_FALSE,这个函数将入列读写命令,但是不会等到整个数据传输操作结束之后才返回。

2.offset参数表示的是所读写的缓存数据的起始位置,data_size参数表示的是从offset开始的待传输数据的大小。origin和region这两个数组表示的是传入或传出图像对象的矩形区域。origin表示的是待访问的第一个像素点的位置,数组中的三个size_t元素分别表示的是像素点所在的列、行以及截面。origin中的最后一个元素必须为0,region中的最后一个元素必须为1.

3.应用程序访问文件的做法是将文件的内容先放到进程内存中,然后通过内存操作的方式读取、修改文件。这个过程称之为内存映射。一旦建立完映射,便可以通过指针或其他的内存操作来读取、修改主机上的内存对象。将缓存对象中的区域映射到主机内存中,将图像对象中的举行区域映射到主机内存中,解映射主机内存中存在的内存对象。

4.映射/解映射函数和读/写函数的另一点区别是函数clEnqueueMapBuffer和函数clEnqueueMapImage中的map_flags参数,用来配置主机上的映射内存的可访问性。

5.操作映射内存中的数据通常分为三步,首先,调用函数clEnqueueMapBuffer或函数clEnqueueMapImage,将内存映射命令入列,然后是使用诸如memcpy之类的函数,对内存中的数据进行传输操作。最后,调用clEnqueueUnmapMemObject函数解映射内存。内存映射的运行性能远高于普通的读/写函数。

6.map_copy应用程序一共入列了四条命令。第一条是传输内核及其参数给设备,第二条是将内存对象复制到另外一个内存对象,第三条是配置整个内存映射,第四条是解内存映射。

7.配置好命令队列,有序处理完所有的命令(默认配置),程序就会将buffer_one中的内容,传输给buffer_two,并将buffer_two以你干涉到主机内存上。

8.单个设备上进行数据和计算任务的分配:大多数的opencl设备包含了数个处理单元,通过代码,你可以具体控制各个单元所处理的数据大小。在单个设备上进行数据划分的函数只有一个:函数clEnqueueNDRangeKernel,但是和函数ClEnqueueTask不同,函数clEnqueueNDRangeKernel允许在设备上的不同处理资源间分配、执行内核。比Task多的四个参数如下:
(1. work_dims–数据的维度数;
(2.global_work_offset–g=各个维度上的全局ID偏移量;
(3.global_work_size–各个维度上工作项的数量;
(4.local_work_size–各个维度上一个工作组中工作项的数量。

9.opencl不需要在内核中配置循环语句,内核只会执行最内层的循环,我们将最内层的一次迭代称之为一个工作项。

10.内核表示的是一系列处理数据的任务所组成的集合,而工作项只是针对某个特定数据集的内核实现。不同的内核,工作项的数量也不同。一个全局ID中的元素称之为这个数据的维度,可以通过设置函数clEnqueueNDRangeKernel的参数work_dims来配置数据的维度,维度的最小取值可以为1.而最大取值则因设备的不同而不同。如果缓存对象所包含的数据是一个二维矩阵,就可能需要将work_dims的取值设为2.

发布了19 篇原创文章 · 获赞 20 · 访问量 572

猜你喜欢

转载自blog.csdn.net/INFINALGEORGE/article/details/105124408