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的更多相关文章

  1. 基于SoCkit的opencl实验1-基础例程

    基于SoCkit的opencl实验1-基础例程 准备软硬件 Arrow SoCkit Board 4GB or larger microSD Card Quartus II v14.1 SoCEDS ...

  2. OPenCL

    OpenCLhttp://baike.baidu.com/link?url=7uHWCVUYB3Sau_xh3OOKP-A08_IvmT1SJixdAXKezCuCfkzeSQDiSmesGyVGk8 ...

  3. Opencl 并行求和

    上周尝试用opencl求极大值,在网上查到大多是求和,所谓的reduction算法.不过思路是一样的. CPP: ; unsigned ; ; ; int nGroup = nGroupSize / ...

  4. opencl初体验

    总结一下,opencl的步骤差不多是这些 先要获取平台的id clGetPlatformIDs(nPlatforms, platform_id, &num_of_platforms) 然后获取 ...

  5. Altera OpenCL用于计算机领域的13个经典案例(转)

    英文出自:Streamcomputing 转自:http://www.csdn.net/article/2013-10-29/2817319-the-application-areas-opencl- ...

  6. 面向OPENCL的ALTERA SDK

    面向OPENCL的ALTERA SDK 使用面向开放计算语言 (OpenCL™) 的 Altera® SDK,用户可以抽象出传统的硬件 FPGA 开发流程,采用更快.更高层面的软件开发流程.在基于 x ...

  7. OpenCV GPU CUDA OpenCL 配置

    首先,正确安装OpenCV,并且通过测试. 我理解GPU的环境配置由3个主要步骤构成. 1. 生成关联文件,即makefile或工程文件 2. 编译生成与使用硬件相关的库文件,包括动态.静态库文件. ...

  8. CUDA/OpenCL 学习资料

    VS2010 NVIDIA OpenCL 开发环境配置 CUDA 在线课程 [经典培训] 全球首套中文CUDA 教程-胡文美教授主讲

  9. opencl 学习资源

    1.AMD  opencl-optimization-guide http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated ...

  10. opencl gauss filter优化(三)

    1.根据前两次的最终结果: 使用普通buffer,Horizontal 5ms, Vertical 17 ms 使用image buffer:Horizontal 9.4ms, Vertical 6. ...

随机推荐

  1. windows下UDP服务器和客户端的实现

      UDP是面向非连接的协议,因此在实现UDP服务器时,服务器不用总是处于监听状态.可以直接收发数据.   服务器端   1.初始化 WASStartup ( ... )   2.创建Socket s ...

  2. Failed to start component [StandardEngine[Catalina].StandardHost[localhost....

    今天我用了近一天的时间研究一个错误,早上写代码是遇到一个 错误严重错误代码如下: 严重: ContainerBase.addChild: start: org.apache.catalina.Life ...

  3. Android多分辨率适配

    前一阶段开发android项目,由于客户要求进行多分辨率适配,能够支持国内主流的分辨率手机.因此经过了几次开发走了很多弯路,目前刚刚领略了android多分辨率适配的一些方法. 先介绍一下所走的弯路, ...

  4. ViewState

    ViewState就像一个记录本,由于WebFormd的无状态性,刷新了页面.那么这个页面就和上一个页面没有任何关系了.为了使刷新前的页面和本页面产生联系,ViewState的作用就是记录刷新前页面的 ...

  5. OS: 剪裁UIImage部分不规则区域

    首先,我们需要把图片展示在界面上.很简单的操作,唯一需要注意的是由于CGContextDrawImage会使用Quartz内以左下角为(0,0)点的坐标系,所以需要使用CGContextTransla ...

  6. 数据库连接池系列之——c3p0

    c3p0的jar包是:c3p0-0.9.1.jar <bean id = "dataSource" class = "com.mchange.v2.c3p0.Com ...

  7. iOS面试和招聘

    1, <招聘一个靠谱的iOS>面试题参考答案(上) 2, 招聘一个靠谱的 iOS

  8. ajax接收返回值获取不到问题

    function testAsync() { //定义一个全局变量来接受$post的返回值 var result; //用ajax的“同步方式”调用一般处理程序 $.ajax({ url: " ...

  9. Practical Java

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  10. python 自动生成C++代码 (代码生成器)

    python 代码自动生成的方法 (代码生成器) 遇到的问题 工作中遇到这么一个事,需要写很多C++的底层数据库类,但这些类大同小异,无非是增删改查,如果人工来写代码,既费力又容易出错:而借用pyth ...