opencl:c++接口(cl.hpp)利用cl::LocalSpaceArg设置__local 参数
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/51425981
当我们需要在kernel中使用local memory数组的时候,有两种方式定义local 数组 第一种,编译期静态定义,这是比较普通的使用方式,如下代码,这种方式,在编译期就分配了local 数组的大小。
#define LOCAL_ARRAY_SIZE 64 // LOCAL_ARRAY_SIZE 可以通过编译选项-D在编译的时候定义
__kernel void test_kernel(
){
__local int local_buf[LOCAL_ARRAY_SIZE];
DEBUG_LOG("(%d,%d)n",get_local_size(0),get_local_size(1));
}
第二种,kernel运行时指定,如下代码,:
__kernel void test_kernel(
__local int *local_buf
){
DEBUG_LOG("(%d,%d)n",get_local_size(0),get_local_size(1));
}
在调用kernel的时候,通过clSetKernelArg(参见 clSetKernelArg官方说明)指定数组的大小
请注意,根据上面clSetKernelArg的参数说明(红线标记部分),当对于地址修饰符为__local
的参数,arg_value指针必须为NULL。
使用opencl的C接口时,这都不是事儿。但是如果使用opencl的C++接口,如何用cl::Kernel::setArg成员函数,设置一个有长度却指针为nullptr的参数呢?这是个不可能完成的任务嘛。
下面是cl::Kernel::setArg的代码
template <typename T>
cl_int setArg(cl_uint index, const T &value)
{
return detail::errHandler(
::clSetKernelArg(
object_,
index,
detail::KernelArgumentHandler<T>::size(value),
detail::KernelArgumentHandler<T>::ptr(value)),
__SET_KERNEL_ARGS_ERR);
}
opencl在设计c++接口的时候已经考虑到了这一点,所以提供了一个LocalSpaceArg
结构对象用于local地址空间指针参数的设置。
下面代码是LocalSpaceArg
的定义,非常简单,就只有一个size_t,指定要分配的local memory字节数。
//! brief Local address wrapper for use with Kernel::setArg
struct LocalSpaceArg
{
::size_t size_;
};
/*! Local
* brief Helper function for generating LocalSpaceArg objects.
*/
inline LocalSpaceArg
Local(::size_t size)
{
LocalSpaceArg ret = { size };
return ret;
}
// Local函数用于返回一个LocalSpaceArg对象
所以使用opencl C++接口时,设置__local
参数,
只需要将要分配的local memory的长度值,封装在LocalSpaceArg
结构中再调用cl::Kernel::setArg
就成了,
如下:
cl::Kernel kernel;
kernel.setArg(0,cl::LocalSpaceArg{512});//分配512字节的local memory
//也可以使用cl::Local创建cl::LocalSpaceArg对象
kernel.setArg(0,cl::Local(512));//分配512字节的local memory
注意: 当使用这种方式动态分配local memory的时候,因为无法确定local memory的使用量,所以在使用CodeXL进行kernel代码静态分析的时候,只能假设使用了全部local memory,所以有效并发约束(Effective concurrency constraint)永远显示为1
- Winform窗口里的嵌入WPF的UserControl,关闭Winform父窗体的方法
- LINQ分页和排序,skip和Take 用法
- 这或许是对小白最友好的python入门了吧——21,导入模块
- opoa介绍
- 数据库记录安全解决方案
- 基于计算机视觉和OpenCV:创建一个能够计算道路交通流量的应用
- 这或许是对小白最友好的python入门了吧——20,定义函数简单应用
- 数据库结构版本控制
- Extjs4---Cannot read property 'addCls' of null 或者 el is null 关于tab关闭后再打开不显示或者报错
- 【干货】什么?Python3.X不能输出中文?原来是编辑器geany的锅?!
- Shell 历史记录异地留痕审计与监控
- [译]WebAPI下的如何实现参数绑定
- 这或许是对小白最友好的python入门了吧——10,元组
- Extjs 在项目中碰到问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C#中关于SqlDataAdapter的Update(dataTable)方法
- Jmeter保存下载的文件
- SNAP Java API处理Sentinel-1数据
- springboot开发spark-submit的java代码
- Kustomize ConfigMapGenerate自动生成ConfigMap中的坑
- Godot游戏开发实践之二:AI之寻路新方式
- Vue 侦听器 watch 扩展之立即触发回调、深度监听和注销
- WPF开发之以管理员身份运行
- 快速学习-Sentinel: 分布式系统的流量防卫兵
- Godot游戏开发实践之一:使用High Level Multiplayer API制作多人游戏(上)
- Godot游戏开发实践之一:使用High Level Multiplayer API制作多人游戏(下)
- ansible生产环境使用场景(二)
- Go 语言实现 RPC 调用
- django FileResponse 解决中文命名文件下载后乱码问题
- systemctl控制服务配置