读书频道 > 网站 > 网页设计 > OpenCL异构并行计算:原理、机制与优化实践
3.6.3 查询和管理内核对象
15-12-07    下载编辑
收藏    我要投稿   
本书一共分为4个部分:第1章介绍并行计算的沿革与现状。第2章介绍了OpenCLC语言的相关语法。第3章到第5章讲解了OpenCL运行时接口及其功能。第6章讲解了OpenCL更底层的工作机制,并结合当前主流的GPGPU做详细分析立即去当当网订购

一旦创建了内核对象,开发人员如果想知道内核对象的一些属性信息,可以使用如下函数查询内核对象的属性信息:

cl_int clGetKernelInfo(cl_kernel kernel,
                       cl_kernel_info param_name,
                       size_t param_value_size,
                       void *param_value,
                       size_t *param_value_size_ret)

参数param_name为查询内核对象的属性名称,可接受的参数见表3-12。参数param_value为存储结果的位置指针。参数param_value_size为参数param_value的字节数。参数param_value_size_ret为实际写入的字节数。


 

函数clGetKernelInfo()不能查询特定于某个设备的内核对象的信息。例如,如果想知道如何将一个并行负载分派到执行内核的多个不同设备上,那该如何处理呢?在OpenCL中提供了如下函数可以查询特定于某个设备的内核对象属性信息:

cl_int clGetKernelWorkGroupInfo(cl_kernel kernel,
                                cl_device_id device,
                                cl_kernel_work_group_info param_name,
                                size_t param_value_size,
                                void *param_value,
                                size_t *param_value_size_ret)

参数device为内核对象关联的设备列表中的一个特定设备。参数param_name为查询内核工作组信息的属性名称,可接受的参数见表3-13。其他参数与clGetKernelInfo()意义一样,在此就不赘述。


 


除了可以查询内核对象的属性信息,还可以查询内核函数参数信息。OpenCL提供如下函数来实现对内核函数参数属性查询:

cl_int clGetKernelArgInfo(cl_kernel kernel,
                          cl_uint arg_index,
                          cl_kernel_arg_info param_name,
                          size_t param_value_size,
                          void *param_value,
                          size_t *param_value_size_ret)

参数arg_index为参数索引。参数param_name为查询内核函数参数的属性名称,可接受的参数见表3?14。其他参数与clGetKernelInfo()意义一样,在此就不赘述。


 

下面的例子展示了如何使用上述三个函数来查询有关的属性信息:

……
size_t size;
char *KernelName;
char *ArgName;
clGetKernelInfo(kernel, CL_KERNEL_FUNCTION_NAME, 0, NULL, &size);
KernelName = (char *)malloc(size);
clGetKernelInfo(kernel, CL_KERNEL_FUNCTION_NAME, size,
                KernelName, NULL);
clGetKernelWorkGroupInfo(kernel, device,
                         CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE,
                         sizeof(size_t), &size, NULL);
clGetKernelArgInfo(kernel, 0, CL_KERNEL_ARG_NAME, 0, NULL,
                   &size);
ArgName = (char *)malloc(size);
clGetKernelArgInfo(kernel, 0, CL_KERNEL_ARG_NAME, size, ArgName,
                   NULL);
……

上述代码分别查询了内核函数名称,指定设备执行内核的最优的工作组大小倍数,以及内核函数参数的名称。

对于创建的内核对象,可以使用如下参数操作内核对象的引用计数值:

cl_int clRetainkernel(cl_kernel kernel)
cl_int clReleasekernel (cl_kernel kernel)

clRetainkernel增加内核对象引用计数(引用计数+1),clReleasekernel减少内核对象引用计数(引用计数-1)。当引用计数值为0是,则释放内核对象。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站