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. ...
随机推荐
- 证码识别--type1
证码识别--type1 从最简单的开始.主要 ...
- ArrayList,Vector,HashMap,HashSet,HashTable之间的区别与联系
在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...
- c++类中的常量
C++类中的常量 由于#define 定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用 const 修饰数据成员来实现.const 数据成员的确是存在的,但其含义却不是我们所期望的.cons ...
- JAVAWeb使用POI做导出Excel
一.需要了解的API ①HSSFWorkBook //代表一个Excel文件 ②HSSFSheet //代表一个表 ③HSSFRow //代表一个表中的某一行 ④HSSFCell //代表一个表中的某 ...
- C#获取当前页面的url
C#获取当前页面的url string a= Request.ApplicationPath; // / string b = Request.CurrentExecutionFilePath; // ...
- linux 开启wifi热点
1,在网络连接管理中创建一个wifi连接,点击 Add,然后选Wi-Fi 2,设置wifi热点名字.wifi接连名字 3,设置 Mode 选 Ad-hoc,其它默认. 4,在 Wi-Fi Securi ...
- 谢启鸿谈"如何学好高等代数"
高等代数和数学分析.空间解析几何一起,并称为数学系本科生的三大基础课.所谓基础课,顾名思义,就是本科四年学习的所有数学课程,都是以上述三门课作为基础的.因此对一年级新生而言,学好这三门基础课,其重要性 ...
- Git笔记 整理2
补充: 1,如何只克隆git仓库中的一个分支? git clone -b <branch> <remote_repo> eg: git clone -b vivien_dev ...
- RTP学习笔记
一.定义 实时传输协议(Real- time Transport Protocol,RTP)是在Internet上处理多媒体数据流的一种网络协议,利用它能够在一对一(unicast,单播)或者一对多 ...
- Mybatis的二级缓存配置
一个项目中肯定会存在很多共用的查询数据,对于这一部分的数据,没必要每一个用户访问时都去查询数据库,因此配置二级缓存将是非常必要的. Mybatis的二级缓存配置相当容易,要开启二级缓存,只需要在你的 ...