博客
关于我
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

你可能感兴趣的文章
NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
【Flink】Flink 1.9 版本 web UI 突然没有日志
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_实际操作---大数据之Nifi工作笔记0020
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_实际操作_02---大数据之Nifi工作笔记0032
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
查看>>
NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
查看>>
NIFI大数据进阶_使用NIFI表达式语言_来获取自定义属性中的数据_NIFI表达式使用体验---大数据之Nifi工作笔记0024
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_内嵌ZK模式集群2_实际操作搭建NIFI内嵌模式集群---大数据之Nifi工作笔记0016
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_实际操作_03---大数据之Nifi工作笔记0035
查看>>