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. ...
随机推荐
- Kernel启动时 驱动是如何加载的module_init,加载的次序如何;略见本文
Init.h中有相关initcall的启动次序,在system.map中可看出具体的__initcall指针的前后次序 #define pure_initcall(fn) __define_initc ...
- 什么是RAW数据?
现在数码照片的存储格式,以及在网络上应用的最普遍的图片格式就是JPEG格式了(Joint Photographic Expert Group).但是作为一种有损的图像压缩格式(现在也有少数数码相机提供 ...
- php基础复习(一)smarty模板
一.基本配置第一步:下载smarty:官网www.smarty.net第二步:加载类文件和更改配置 1. //加载类文件 require_once '../libs/Smarty.class.php' ...
- Spark系列之二——一个高效的分布式计算系统
1.什么是Spark? Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥有H ...
- RabbitMQ术语
工作队列:Working Queue 分配:多个客户端接收同一个Queue,如何做负载均衡(分配). Round-robin分配:多个接收端接收同一个Queue时,采用了Round-robin ...
- 【Java】如何调用系统命令
如何通过Java调用系统命令,如ping 127.0.0.1.java -version等? > 简单的例子 package com.nicchagil.callpython.No001无参数调 ...
- DBCP连接Oracle,数据库重启后现OALL8 is in an inconsistent state异常
最近,DBCP连接Oracle,数据库重启后现OALL8 is in an inconsistent state异常. 版本说明 commons-dbcp-1.4.jar commons-pool-1 ...
- 没有必要去指定SqlSessionFactory或SqlSessionTemplate
<!-- 自动注册mybatis mapper bean --><!-- 注意,没有必要去指定SqlSessionFactory或SqlSessionTemplate, 因为 ...
- 高通安卓调试LCD几方面总结
来公司上班现在已经整整一个月了,蔽人不才,能力有限,学习进度缓慢,不过也是有一点点的收获与心得,在这里写出来与大家分享,养成良好的记录习惯也免得后忘记. 不啰嗦了,开入正题.来公司一个月左右的时间,主 ...
- 编写一个类A,该类创建的对象可以调用方法f输出小写的英文字母表。然 后再编写一个A类的子类B,要求子类B必须继承类A的方法f(不允许重写), 子类B创建的对象不仅可以调用方法f输出小写的英文字母表,而且可以调用子 类新增的方法g输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。
package zimu; public class A { public void f() { for (int i = 97; i <123; i++) { System.out.print ...