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. ...
随机推荐
- dede源码详细分析之--全局变量覆盖漏洞的防御
http://blog.csdn.net/ebw123/article/details/8100594
- 基于@AspectJ和schema的aop(四)---@AspectJ进阶
@AspectJ可以使用切点函数定义切点, 我们还可以使用逻辑运算对切点进行复合运算得到复合的切点. 我们还可以对切点进行命名, 从而可以复用切点.当一个连接点匹配多个切点时, 需要考虑增强织入的顺序 ...
- MUI 框架微信支付
在MUI 框架中实现了支付宝支付后,以为MUI微信支付,也没什么大问题,结果这个问题困扰了我几天,后面再同事的提醒下终于弄出来了, 问题出在,开始使用Dcloud 公有证书 怎么也付不了....,后面 ...
- ContentProvider官方教程(6)provider支持的数据类型
Provider Data Types Content providers can offer many different data types. The User Dictionary Provi ...
- extern "C" __declspec(dllexport) __declspec(dllimport) 和 def
原文:extern "C" __declspec(dllexport) __declspec(dllimport) 和 def 前面的extern "C" _ ...
- 【转载】nedmalloc结构分析
原文:nedmalloc结构分析 nedmalloc是一个跨平台的高性能多线程内存分配库,很多库都使用它,例如:OGRE.现在我们来看看nedmalloc的实现 (以WIN32部分为例) 位操作 ...
- Create,Insert
创建表 create table people ( id int ,name ) ) create table toys ( id int ,name ) ,people_id int ) CREAT ...
- apue和error
在做进程环境测试的时候,测试demo中出现了apue.h,而标准库中没有这个头文件和其中的函数定义,经查找需要在/usr/include中添加apue.h和error.c.原型可以去这个网站查找. ...
- SQL Server 2005 中的同义词
From : http://blog.csdn.net/itblog/article/details/752881 =============创建同义词 可以为下列对象类型创建同义词: 程序集 (CL ...
- .net 常用Response.ContentType
来源:http://blog.csdn.net/navy235/article/details/5982319 不同的ContentType 会影响客户端所看到的效果.默认的ContentType为 ...