OpenCL如何判定一个work-group的最大Local Memory大小
最近有不少朋友提及到如何能在运行时获悉一个GPU的最大local memory的尺寸。由于OpenCL对各类处理器开放,因此不同处理器所拥有的local memory大小也各不相同。即便是GPU,甚至同一家公司出的GPU,不同的架构,其Local Memory的尺寸也各不相同。一般来说,现在随着制程工艺的不断发展,Local Memory也逐步变大。
这里简单地通过运行时动态试探法来获悉你当前所使用的GPU,一个Compute Unit上的Local Memory大小。至少,我们可以了解到一个work group最多能容纳多少大小的local memory。
其实原理很简单。如果你针对一个特定的GPU写的kernel代码,里面给一个work group分配的local memory超过了其最大尺寸限制,则在构建kernel程序的时候编译器就会报错。我们通过这一特点来试探当前GPU的每个work-group最大的local memory尺寸是多少。
代码很简单,直接在主机端写OpenCL内核代码字符串。每次比前一次多申请4KB的大小,然后看看构建结果。
/** Query local memory size */
char kernelSrcBuffer[];
int localMemorySize = ; for(int i = ; i < ; i++)
{
size_t kernelLength = sprintf(kernelSrcBuffer, "__kernel void QueryLDSSize(void){ __local int lds[%d * 1024]; }", i);
const char *pKernelSrc = kernelSrcBuffer;
program = clCreateProgramWithSource(context, , &pKernelSrc, &kernelLength, NULL);
if(clBuildProgram(program, , &device, NULL, NULL, NULL) == CL_BUILD_PROGRAM_FAILURE)
{
clReleaseProgram(program);
localMemorySize = (i - ) * ; // 注意,这里单位是KB
break;
}
clReleaseProgram(program);
}
这里省略了cl_dvice以及cl_context变量的声明和初始化,这些由开发者自己实现,呵呵~
在Intel HD Grapchis 5000上,Local Memory的尺寸为64KB。
OpenCL如何判定一个work-group的最大Local Memory大小的更多相关文章
- 【并行计算-CUDA开发】Apple's OpenCL——再谈Local Memory
在OpenCL中,用__local(或local)修饰的变量会被存放在一个计算单元(Compute Unit)的共享存储器区域中.对于nVidia的GPU,一个CU可以被映射为物理上的一块SM(Str ...
- 在C++的函数中如何指定一个数组,使得这个数组的大小由函数的输入值来决定
今天调试一个C++程序,在一个函数中定义了一个一维数组,设定数组的大小由函数的输入值来决定. 是这样子的: ]; 然后发现:报错! 报错是这样的: 那么问题来了,在C++中定义数组一定要指定数组大小么 ...
- 一个关于group by和having子句的小例子
表结构: 要求: 查询有多个员工的工资不低于2000的部门编号(就是说如果一个部门的员工大于2000的人数有两个或两个以上就查询出来) sql语句: select [DEPARTMENT_ID],co ...
- 怎么判定一个mac地址是multicast还是unicast.
MAC地址是以太网二层使用的一个48bit(6字节十六进制数)的地址,用来标识设备位置.MAC地址分成两部分,前24位是组织唯一标识符(OUI, Organizationally unique ide ...
- SqlSever基础 一个条件group by 一列有两个内容,分组并查看每个内容有多少行,并用as起名
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- 笔试算法题(35):最长递增子序列 & 判定一个字符串是否可由另一个字符串旋转得到
出题:求数组中最长递增子序列的长度(递增子序列的元素可以不相连): 分析: 解法1:应用DP之前需要确定当前问题是否具有无后效性,也就是每个状态都是对之前状态的一个总结,之后的状态仅会受到前一个状态的 ...
- C++笔记(0)——判定一个数字是否是素数
博主之前使用的编程语言是Python,但是这门语言的效率比较低(通常,不优化的情况下,但是即便如此我还是偏爱Python),而且博主打算参加PAT考试(真正的原因),及博主打算顺便深入学习下机器学习框 ...
- 一个有关group by的错误
事例:查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资 SELECT department_name,MIN(salary),departments.manager_idFROM dep ...
- golang 裸写一个pool池控制协程的大小
这几天深入的研究了一下golang 的协程,读了一个好文 http://mp.weixin.qq.com/s?__biz=MjM5OTcxMzE0MQ==&mid=2653369770& ...
随机推荐
- JavaScript基础概念与语法
学习了一些最基础的JavaScript语法: <!DOCTYPE html> <html lang="en"> <head> <meta ...
- Sliverlight/WPF 样式使用方法
1,UserControl 页面级样式: UserControl.Resources style setter Property value. TargetType为应用的类型 <UserCon ...
- ln -s vs mount --bind
First ,Symlinks and bind mounts are a whole different ballgame. ln -s you create a symbolic link,whi ...
- 异常-Exception in thread "main" net.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 1, column 596. Encountered: <EOF> after :
1 详细异常 Exception in thread "main" net.sf.jsqlparser.parser.TokenMgrError: Lexical error at ...
- 【异常】java.sql.SQLException: Could not retrieve transaction read-only status from server Query
1 详细异常 java.sql.SQLException: Could not retrieve transaction read-only status , ], [ChargingOrderRea ...
- k2系列-安装篇
K2介绍: K2是基于BPM的流程开发平台,它支持在net开发环境/visio/moss等不同环境下进行流程开发. K2本身部署简单,操作灵活,非常适合大中型企业流程开发和部署. K2安装步骤: 首先 ...
- K8S漏洞报告 | 近期bug fix解读&1.13主要bug fix汇总
K8s近期漏洞详解 Kubernetes仪表盘漏洞(CVE-2018-18264) 因为这一漏洞,用户可以“跳过”登录过程获得仪表盘所使用的自定义TLS证书.如果您已将Kubernetes仪表盘配置为 ...
- 极光推送出现 超时问题:Connect timeout. Please retry later. Error:7
检查之后均没有什么太大的问题, 最后发现出现77这种错误码,有一种可能就是系统的ca包没有更新 包名为 ca-certificates 使用命令 yum install ca-certificates ...
- MySQL进阶8 分页查询(limit) - 【SQL查询语法执行顺序及大致结构】- 子查询的3个经典案例
#进阶8 分页查询 /* 应用场景: 当要显示的数据,一页显示不全,需要分页提交sql请求 语法: select 查询列表 #7 from 表1 #执行顺序:#1 [join type join 表2 ...
- python_json模块和pickle模块
json 优点:所有语言通用:缺点:只能序列化基本的数据类型list/dict/int... json格式中,字符串必须是双引号,字符都是小写. 序列化: import json v = [12,3, ...