博客
关于我
OpenCL异构并行计算编程笔记(2):命令队列与内存对象
阅读量:147 次
发布时间:2019-02-26

本文共 3246 字,大约阅读时间需要 10 分钟。

四、建立命令队列(Command Queue):

       命令队列是主机端向上下文中其他设备发送请求的行为机制,主机通过命令队列建立与其他内核的通信,控制其他计算单元完成相关的操作行为。在同一个上下文中可同时存在多个命令队列,每个命令队列只关联一个设备。在命令队列中,一系列命令按照主机端命令发送的先后顺序排队,并在设备端依次执行。

创建命令队列可以使用:

cl_command_queue clCreateCommandQueue( cl_comtext context,

                                                                            cl_device_id device,
                                                                            cl_command_queue_properties properties,
                                                                            cl_int *errcode_ret)

       该函数第一个参数是命令队列所处的上下文;

                  第二个参数是命令队列所连接的设备,该设备必须处于第一个参数所表示的上下文中;
                  第三个参数指定命令队列的一系列属性,包括设置命令的执行顺序等;
                  第四个参数返回错误码。
       如果建立上下文完成,该函数返回一个非0的上下文。

查询命令队列信息可使用:

cl_int clGetCommandQueueInfo(cl_command_queue command_queue,

                                                                            cl_command_queue_info qaram_name,
                                                                            size_t param_vallue_size,
                                                                            void *param_value,
                                                                            size_t *param_value_size_ret)

       该函数第一个参数为指定要查询的命令队列;

                  第二个参数确定要查询的信息;
                  第三个参数指向查询的结果;
                  第四个参数确定保存查询结果的内存大小,为NULL时忽略;
                  第五个参数为查询结果实际的大小,为NULL时忽略;

使用示例:

[cpp]
  1. cl_int ret;               //用于保存函数返回值  
  2. cl_context_properties context_props[] = { CL_CONTEXT_PLATFORM, (cl_context_properties)platform[1], 0 };     //用于设置命令队列属性  
  3. size_t ext_size;          //用于保存命令队列信息大小  
  4. char *ext_data;          //用于保存命令队列信息  
  5. cl_platform_info command_queue_info = CL_QUEUE_COMTEXT;    //设置所要查询的信息  
  6.   
  7. //  
  8. //建立命令队列  
  9. cl_context command_queue = clCreateContext(context, device, context_props, &ret);  
  10.   
  11. //  
  12. //获取命令队列信息大小  
  13. ret = clGetCommandQueueInfo(command_queue, command_queue_info, context_props, NULL, ext_size)  
  14.   
  15. //  
  16. //为ext_data分配空间大小  
  17. ext_data = new char[ext_size];  
  18.   
  19. //  
  20. //获取命令队列信息  
  21. ret = clGetCommandQueueInfo(command_queue, command_queue_info, ext_size, ext_data, NULL);  
  22.   
  23. std::cout << ext_data << std::endl;     //输出命令队列信息  

五、创建内存对象:

       在异构计算中,主机无法直接使用其他设备的存储资源,而是通过内存对象来对设备的存储加以管理,包括向设备拷贝数据以及从设备拷贝数据到主机。一般对于核函数的输入及输出来说,都要建立相应的内存对象。

创建缓冲内存对象可以使用:

cl_mem clCreateBuffer(cl_context context,

                                      cl_mem_flags flags,
                                      size_t size,
                                      void *host_ptr,
                                      cl_int *errcode_ret)

       该函数第一个参数为设备所在上下文;

                  第二个参数指定内存对象的属性,包括可读可写性以及传递方式等;
                  第三个参数表示缓冲内存对象的大小;
                  第四个参数执行分配的缓冲数据;
                  第五个参数返回错误码。

从主机向缓冲内存对象写入数据和从缓冲内存对向主机内存中读入数据可使用:

cl_int clEnqueueWriteBuffer(cl_command_queue command_queue,

                                             cl_mem buffer,
                                             cl_bool blocking_write,
                                             void size_t offset,
                                             size_t cb,
                                             const void *ptr,
                                             cl_uint num_events_in_wait_list,
                                             const cl_event *event_wait_list,
                                             cl_event *event)

cl_int cl_EnqueueReadBuffer(cl_command_queue command_queue,

                                             cl_mem buffer,
                                             cl_bool blocking_write,
                                             void size_t offset,
                                             size_t cb,
                                             const void *ptr,
                                             cl_uint num_events_in_wait_list,
                                             const cl_event *event_wait_list,
                                             cl_event *event)

       该函数第一个参数为存在于缓冲内存对象所在上下文的命令队列;

                  第二个参数为一个有效的缓冲内存对象;
                  第三个参数指定读写是阻塞的还是非阻塞的;
                  第四个参数为读写操作在缓冲内存对象上的偏移量。
                  第五个参数为要读写的字节大小;
                  第六个参数指向要从主机内存读写的数据;
                  第七、八参数指定在执行此命令前必须完成的事件及其个数;
                  第九个参数返回标识读写命令的事件;
       在程序中,这条语句会向命令队列中加入读写该缓冲内存对象的命令,可通过函数返回的事件对象来确定此命令的执行状态,这点会在之后的事件对象部分加以详述。

使用示例:

[cpp]
  1. cl_int ret;               //用于保存函数返回值  
  2. int input[5] = [1,2,3,4,5];    //存放向缓冲内存区域写入的数据  
  3. int *output = new int[5];      //存放从缓冲内存区域读出的数据  
  4. cl_enent enent;    //存放读写命令的事件对象  
  5.   
  6. //  
  7. //创建可读可写缓冲内存对象  
  8. cl_mem data = clCreateBuffer(context, CL_MEM_READ_WRITE, (size_t)(5 * sizeof(int)), NULL, &ret)  
  9.   
  10. //  
  11. //向缓冲内存对象写入数据  
  12. ret = clEnqueueWriteBuffer(command_queue, data , CL_TRUE, 0, (size_t)(5 * sizeof(int)), input, NULL, NULL, &enent)  
  13.   
  14. //  
  15. //从缓冲内存对象读出数据  
  16. ret = clEnqueueReadBuffer(command_queue, data , CL_TRUE, 0, (size_t)(5 * sizeof(int)), output, NULL, NULL, &enent)  
  17.   
  18. for(unsigned int i = 0; i < 5; ++i)  
  19. {  
  20.    std::cout << output[i] << std::endl;     //输出命令队列信息  
  21. }  

       完成了命令队列以及核函数所需的每个内存对象的创建后,就可以开始着手构建核函数、建立程序对象并执行核函数了。(To Be Continued)

原文:http://blog.csdn.net/catalyst_zx/article/details/52818557

你可能感兴趣的文章
ngrok内网穿透可以实现资源共享吗?快解析更加简洁
查看>>
ngrok内网穿透可以实现资源共享吗?快解析更加简洁
查看>>
NHibernate动态添加表
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
Nhibernate的第一个实例
查看>>
NHibernate示例
查看>>
nid修改oracle11gR2数据库名
查看>>
NIFI1.21.0/NIFI1.22.0/NIFI1.24.0/NIFI1.26.0_2024-06-11最新版本安装_采用HTTP方式_搭建集群_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_插入时如果目标表中已存在该数据则自动改为更新数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0058
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
查看>>
NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增加修改实时同步_使用JsonPath及自定义Python脚本_03---大数据之Nifi工作笔记0055
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>