about opencl
Platform:LG G3,Adreno 330
1.
8M(3264x2448)
memmap方式读入时间24ms,读出时间12ms,时间与内存大小基本成线性关系。使用memmap
与 memcopy(clEnqueueWriteBuffer)方式并无时间差异。
2.使用pingpong的方式,使memory读写与kernel执行同时执行。在clFinish(commandQueue)等待kernel执行时可以进行memory操作.
cl_context mem_context = ;
cl_command_queue mem_commandQueue = ;
...
cl_mem memoryObjects2 = clCreateBuffer(mem_context, CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR , bufferSize, NULL, &errorNumber);
...
t0 = now_ms();
{
cl_uchar* luminance = (cl_uchar*)clEnqueueMapBuffer(mem_commandQueue, memoryObjects2, CL_TRUE, CL_MAP_WRITE, , bufferSize, , NULL, NULL, &errorNumber); memcpy(luminance,in,bufferSize); if (!checkSuccess(clEnqueueUnmapMemObject(mem_commandQueue, memoryObjects2, luminance, , NULL, NULL)))
{
}
// clEnqueueWriteBuffer(mem_commandQueue, memoryObjects2, CL_TRUE, 0, bufferSize,in, 0, NULL, NULL); //使用 clEnqueueWriteBuffer也是24ms LOGI("memory unmap:%f ms",now_ms() - t0 );
} t0 = now_ms();
/* Wait for completion */
if (!checkSuccess(clFinish(commandQueue)))
{
}
LOGI("Wait for completion time:%f ms",now_ms() - t0 );
结果:
12-02 09:39:54.734: I/GAUSS(8133): memory unmap:26.099365 ms
12-02
09:39:54.738: I/GAUSS(8133): Wait for completion time:4.448486
ms
12-02 09:39:54.752: I/GAUSS(8133): memory out time:12.929443 ms
kernel
执行需要29ms,与26+4.4接近,说明memmap与kernel是同时在运行的。
但是
memoryObjects2
需要单独的
context和
command_queue
.
只有单独的
command_queue,与kernel共用context的情况下:
12-02
09:32:13.712: I/GAUSS(5169): memory unmap:57.429443 ms
12-02
09:32:13.713: I/GAUSS(5169): Wait for completion time:0.022217
ms
12-02 09:32:13.726: I/GAUSS(5169): memory out time:11.878174
ms
memmap的实际时间57
= 24+29,等于memmap的时间加上kernel需要的时间,说明是串行执行的。
3.关于第一点memmap
与
memcopy(clEnqueueWriteBuffer)方式的时间更正.看到AMD的opencl-optimization-guide中提到opecl为了避免为不会被使用memory
object分配device
memory,使用了deferred
allocation策略,即space在第一次使用时才会分配,所以第一次使用memory
object的时间会比较长。
循环多次memmap方式读入8M的image的结果:
12-04
15:31:52.894: I/GAUSS(30530): memory in time:22.367188 ms
12-04
15:31:52.900: I/GAUSS(30530): queue time:6.125732 ms
12-04
15:31:52.929: I/GAUSS(30530): run time:29.329102 ms
12-04
15:31:52.932: I/GAUSS(30530): memory in time:2.342773 ms
12-04
15:31:52.932: I/GAUSS(30530): queue time:0.333252 ms
12-04
15:31:52.962: I/GAUSS(30530): run time:29.895020 ms
12-04
15:31:52.967: I/GAUSS(30530): memory in time:5.199463 ms
12-04
15:31:52.968: I/GAUSS(30530): queue time:0.180176 ms
12-04
15:31:52.997: I/GAUSS(30530): run time:29.568359 ms
12-04
15:31:52.999: I/GAUSS(30530): memory in time:1.941162 ms
12-04
15:31:52.999: I/GAUSS(30530): queue time:0.183594 ms
12-04
15:31:53.029: I/GAUSS(30530): run time:29.852295 ms
循环多次memcopy(clEnqueueWriteBuffer)的方式:
12-04
15:37:34.747: I/GAUSS(32217): memory in time:22.356689 ms
12-04
15:37:34.752: I/GAUSS(32217): queue time:4.679199 ms
12-04
15:37:34.782: I/GAUSS(32217): run time:30.098877 ms
12-04
15:37:34.784: I/GAUSS(32217): memory in time:1.853516 ms
12-04
15:37:34.784: I/GAUSS(32217): queue time:0.326172 ms
12-04
15:37:34.814: I/GAUSS(32217): run time:29.864990 ms
12-04
15:37:34.816: I/GAUSS(32217): memory in time:1.709473 ms
12-04
15:37:34.816: I/GAUSS(32217): queue time:0.188965 ms
12-04
15:37:34.846: I/GAUSS(32217): run time:29.705322 ms
可以看出memmap
与
clEnqueueWriteBuffer
方式还是无差别,因为deferred
allocation的策略,memory
access,提交任务队列和kernel
执行需要一到两个周期达到最佳性能.
4.相关术语,wavefront,work-group
一个device有若干个compute
uint,一个compute
unit有若干个流核心(stream
core,AMD上叫SIMD,Nvida叫Stream
Processor),每个流核心含有若干个Processing
Element.
一个work-item在一个PE上执行,一个计算单元上的一组工作项以锁步(lock-step,相同的指令不同的数据)的方式执行,称为wavefront,wavefront是硬件调度的基本单元。
一个工作组由一个或多个wavefront组成,在一个工作组内的wavefront切换就可以隐藏访存延迟。例如:访问global
memory需400
cycles,距离下一次memory
access有20
cycles的计算指令,那么就需要20个wavefront来隐藏400
cycles的延迟。
about opencl的更多相关文章
- 基于SoCkit的opencl实验1-基础例程
基于SoCkit的opencl实验1-基础例程 准备软硬件 Arrow SoCkit Board 4GB or larger microSD Card Quartus II v14.1 SoCEDS ...
- OPenCL
OpenCLhttp://baike.baidu.com/link?url=7uHWCVUYB3Sau_xh3OOKP-A08_IvmT1SJixdAXKezCuCfkzeSQDiSmesGyVGk8 ...
- Opencl 并行求和
上周尝试用opencl求极大值,在网上查到大多是求和,所谓的reduction算法.不过思路是一样的. CPP: ; unsigned ; ; ; int nGroup = nGroupSize / ...
- opencl初体验
总结一下,opencl的步骤差不多是这些 先要获取平台的id clGetPlatformIDs(nPlatforms, platform_id, &num_of_platforms) 然后获取 ...
- Altera OpenCL用于计算机领域的13个经典案例(转)
英文出自:Streamcomputing 转自:http://www.csdn.net/article/2013-10-29/2817319-the-application-areas-opencl- ...
- 面向OPENCL的ALTERA SDK
面向OPENCL的ALTERA SDK 使用面向开放计算语言 (OpenCL™) 的 Altera® SDK,用户可以抽象出传统的硬件 FPGA 开发流程,采用更快.更高层面的软件开发流程.在基于 x ...
- OpenCV GPU CUDA OpenCL 配置
首先,正确安装OpenCV,并且通过测试. 我理解GPU的环境配置由3个主要步骤构成. 1. 生成关联文件,即makefile或工程文件 2. 编译生成与使用硬件相关的库文件,包括动态.静态库文件. ...
- CUDA/OpenCL 学习资料
VS2010 NVIDIA OpenCL 开发环境配置 CUDA 在线课程 [经典培训] 全球首套中文CUDA 教程-胡文美教授主讲
- opencl 学习资源
1.AMD opencl-optimization-guide http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated ...
- opencl gauss filter优化(三)
1.根据前两次的最终结果: 使用普通buffer,Horizontal 5ms, Vertical 17 ms 使用image buffer:Horizontal 9.4ms, Vertical 6. ...
随机推荐
- Animator组件关闭再打开后参数丢失问题
问题如下,因为再激活Animator时,它会重置一次,参数也会丢失 这个问题一直存在,论坛给出的解释是把参数缓存下来,在激活时重置 http://answers.unity3d.com/questio ...
- ThreadLocal深入理解二
转载:http://doc00.com/doc/101101jf6 今天在看之前转载的博客:ThreadLocal的内部实现原理.突然有个疑问, 按照threadLocal的原理, 当把一个对象存入到 ...
- malloc与kmalloc
在设备驱动程序中动态开辟内存,不是用malloc,而是kmalloc,或者用get_free_pages直接申请页.释放内存用的是kfree,或free_pages. 对于提供了MMU(存储管理器,辅 ...
- 2014江西理工大学C语言程序竞赛高级组
Beautiful Palindrome Number 题意:求N里面有多少个符合要求的数字(数字要求:回文数,且前一半部分是不严格递增) 解法:打表 #include<bits/stdc++. ...
- 《redis-php中文参考手册》
<redis中文手册>,将示例代码用php来实现,注意php-redis与redis_cli的区别(主要是返回值类型和参数用法). phpredis是redis的php的一个扩展,效率是相 ...
- C语言第5天
[1]数组 多个数据类型相同元素的集合: [2]访问元素 从下标0开始,到N-1结束 [3]定义数组 <存储类型> <数据类型 > <数组名>[<表达式> ...
- MVC系列之一 入门概述
一 概述 MVC作为一种当前比较好的开发web的框架,不得不提一下了,和WebForm比较来看,有了很大的进步和改进. 先进行一个简单的比较,两个都是Web开发框架,理念仍然是较快速开发. 不过MVC ...
- windows api线程
一.1.定义入口函数static void threadFunc(void);//在TestDlg.h里面声明 void CTestDlg::threadFunc(void) //在TestDlg. ...
- Duilib 鼠标在某控件例如按钮上悬停后,对目标控件操作
其实对WM_MOUSEHOVER消息的处理,因为WindowImplBase基类中对此消息未处理,所以在自己的窗口类中实现: .h文件中加入 LRESULT OnMouseHover( UINT uM ...
- [SAP ABAP开发技术总结]数据输入输出转换、小数位/单位/货币格式化
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...