opencl:慎用-cl-opt-disable选项编译kernel(可能会导致一些无法解释的问题)
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/51208721
在编译opencl kernel代码时,有一个编译选项-cl-opt-disable
。根据opencl 官网的原文描述,使用这个选项可以关闭所有的代码优化,便于调试程序。(默认情况下,编译优化选项是打开的)
参见clBuildProgram
但是今天为了调试kernel代码,实际使用这个选项编译kernel却发现,使用这个选项就是坑。使用之后,kernel参数传递都不正常了。 下面这是个很简单的主机端和kernel共用的数据结构
typedef struct _matrix_info_cl {
cl_uint width;
cl_uint height;
cl_uint row_stride;
}matrix_info_cl;
下面是一个有10个参数的kernel函数,其中第二,第六个参数类型都是matrix_info_cl
kernel函数中不干别的,只打印传入的参数的值。
__kernel void object_filter1(
__constant detected_objects_buffer* detected_obj_buf_ptr
,__constant feather_cl * const feather
,const matrix_info_cl im_info
, __constant INTEG_TYPE *integ_mat
,__constant INTEG_TYPE *integ_sqare_mat
,const matrix_info_cl om_info
,__global uchar* hit_mat
,__global float* mean_mat
,__global float* variance_mat
,const filter1_const_param const_param
){
const int y = get_global_id(1);
if(0==y){
DEBUG_LOG("sizeof(detected_obj_buf_ptr)=%d,nsizeof(im_info)=%d,nsizeof(integ_mat)=%d,nsizeof(integ_sqare_mat)=%dn"
,sizeof(detected_obj_buf_ptr)
,sizeof(im_info)
,sizeof(integ_mat)
,sizeof(integ_sqare_mat));
DEBUG_LOG("sizeof(om_info)=%dn,sizeof(hit_mat)=%d,nsizeof(mean_mat)=%d,nsizeof(variance_mat)=%d,nsizeof(const_param)=%dn"
,sizeof(om_info)
,sizeof(hit_mat)
,sizeof(mean_mat)
,sizeof(variance_mat)
,sizeof(const_param));
DEBUG_LOG("sum of all parameters %dn"
,sizeof(detected_obj_buf_ptr)
+sizeof(im_info)
+sizeof(integ_mat)
+sizeof(integ_sqare_mat)
+sizeof(om_info)
+sizeof(hit_mat)
+sizeof(mean_mat)
+sizeof(variance_mat)
+sizeof(const_param));
DEBUG_LOG("im_info.width=%d,im_info.row_stride=%d,height=%d,size=%dn",im_info.width,im_info.row_stride,im_info.height,im_info.row_stride*im_info.height);
DEBUG_LOG("om_info.width=%d,om_info.row_stride=%d,height=%d,size=%dn",om_info.width,om_info.row_stride,om_info.height,om_info.row_stride*om_info.height);
DEBUG_LOG("sizeof(om_info)=%d om_info.row_stride=%xn",sizeof(om_info),om_info.row_stride);
DEBUG_LOG("hit_mat PTR =%xn",hit_mat);
DEBUG_LOG("DIFF row_stride-width=%dn",&om_info.row_stride-&om_info.width);
}
......// other code
}
在主机端给 im_info
传递{738,1024,752},给om_info
传递{714,1000,752}。
当正常编译kernel时(不使用-cl-opt-disable
),结果可以预测,kernel打出来的值跟主机端是一样的。
但是当我使用-cl-opt-disable
编译kernel后,再运行,结果就是下面这样:
请注意红框中om_info.row_stride
的值不对了,是个非常大的数,下一行,是以16进制打印出来的om_info.row_stride
的值0x7866000居然是下一个指针参数hit_mat
的值。
开始我以为是我的定义的数据结构的字节对齐问题(matrix_info_cl
是12个字节),但将matrix_info_cl
对齐到16个字节后问题依旧。而且更不可解释的是同样是matrix_info_cl
,第一个参数im_info
却能正确传递。
后来我尝试改变参数顺序,将om_info参数放到第9位(倒数第二),居然正常了! 反复修改参数传递顺序进行尝试,最后得到的的规律是:
把所有传值参数放在前面,把指针参数放在后面,所有的参数传递就正常了 so why? 还是没办法解释。尼玛,快被你搞崩溃了!!!
总之,我认为-cl-opt-disable
选项编译的kernel代码,参数解析时有问题,但找不到原因。
在网上找了一下,相关资料很少,stackoverflow有类似与-cl-opt-disable
相关的莫名其妙的问题(《OpenCL white space influence private memory usage?》),解决办法就是不用-cl-opt-disable
,却没有人知道原因,不清楚这个问题是具体的OpenCL平台实现有关,还是个通病。
(我的开发平台是VS2015,gcc下还没有测试)
- 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 数组属性和方法
- spring源码(八)
- 通过源码理解rarp协议(基于linux1.2.13)
- 详解Im2Col+Pack+Sgemm策略更好的优化卷积运算
- Kubernetes 使用 ceph-csi 消费 RBD 作为持久化存储
- 聊聊调试的那些事,超实用!!!
- [不定时一题]LeetCode无重复字符的最长子串
- 整理了小程序云开发实战,你看懂了吗?
- Reactive-MongoDB异步Java Driver解读
- 解密Go协程的栈内存管理
- 深入浅出mongodb之实战
- 想成为可视化高手?这篇合集就够了 | Vue
- 谈谈Vue开发过程中用到的插件
- 快速入门使用tikz绘制深度学习网络图
- why哥被一道基础面试题给干懵了,一气之下写出万字长文。
- 结构与算法(03):单向链表和双向链表