有两种方式实现从主机到CL设备的数据传递,

第一种:

cl_mem input = clCreateBuffer(context,CL_MEM_READ_ONLY,sizeof(float) * DATA_SIZE, NULL, NULL);
clEnqueueWriteBuffer(command_queue, input, CL_TRUE, 0, sizeof(float) * DATA_SIZE, inputdata, 0, NULL, NULL);

第二种:

cl_mem input = clCreateBuffer(context,CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float) * DATA_SIZE, inputdata, NULL);
  • 这两种写法可以说是没啥区别,但是如过第二中写法中CL_MEM_COPY_HOST_PTR换成CL_MEM_USE_HOST_PTR,那么根据文档的说法,第二种并不会把主机的inputdata复制到设备,而仅仅是cache
  • 如果inputdata仅仅会初始化一次,那么使用第二种方法看起来更加便捷;但是如果对inputdata要进行多次更新,那么使用第一种的方式更好,可以调用clEnqueueWriteBuffer进行更新
  • 使用第一种可以在clEnqueueWriteBuffer中使用event来测量耗时
  • 第一种写法会先在主机创建一个second temporary buffer on the host,然后等到设置这个buffer到kernel的时候再把数据拷贝到设备上。这样,就可能会在一个短暂的时候,主机上有两份内存。如果buffer比较大,就会引发问题。而第二种方法则是立即把数据复制的设备,没有额外的临时内存分配。参考
  • 如果clcontext上绑定了多个device,那么使用第二种方法则会在每个device上都分配该buffer。如果只想对某个设备分配该buffer,那么就应该使用与device绑定了的clEnqueueWriteBuffer参考
  • 然而,在高通的优化指南中,这两种做法都不推荐。推荐使用Zero Copy的写法,其关键在于CL_MEM_ALLOC_HOST_PTR的应用
// First set cl_mem_flags input in clCreateBuffer:
cl_mem Buffer = clCreateBuffer(context,
CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR,
sizeof(cl_ushort) * size,
NULL,
&status);
//Then use the map function to return a pointer to the host:
cl_uchar *hostPtr = (cl_uchar *)clEnqueueMapBuffer(
commandQueue,
Buffer,
CL_TRUE,
CL_MAP_WRITE,
0,
sizeof(cl_uchar) * size,
0, NULL, NULL, &status); //Host updates the buffer using the pointer hostPtr
memcpy(hostPtr, sizeof(cl_uchar) * size, datafromhost); //Unmapped the object
status = clEnqueueUnmapMemObject(
commandQueue,
Buffer,
(void *) hostPtr,
0, NULL, NULL); //The object can be used by OpenCL kernels

clCreateBuffer和clCreateBuufer + clEnqueueWriteBuffer的更多相关文章

  1. 【异构计算】OpenCL矩阵转置

    介绍 矩阵转置,主要的技巧还是利用好local memory ,防止local memory,以及glabol memory的读取尽量是合并读写. 完整代码一: main.cpp代码 #include ...

  2. OpenCL将数组从内存copy到显存

    本来想对上一篇博客做优化,优化效果不明显.但知识点还是要记一下. 初衷是想把上一篇博客中定义域的计算搬到CPU来计算,因为定义域的计算对于每一个kernel都是一样的,所以直接读取应该是可以进一步减小 ...

  3. Opencl 并行求和

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

  4. opencl初体验

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

  5. Mac OS X 背后的故事

    Mac OS X 背后的故事 作者: 王越  来源: <程序员>  发布时间: 2013-01-22 10:55  阅读: 25840 次  推荐: 49   原文链接   [收藏]   ...

  6. about opencl

    Platform:LG G3,Adreno 330 1. 8M(3264x2448) memmap方式读入时间24ms,读出时间12ms,时间与内存大小基本成线性关系.使用memmap 与 memco ...

  7. OpenCL memory object 之 Global memory (2)

    转载自:http://www.cnblogs.com/mikewolf2002/archive/2011/12/18/2291584.html 当我们用clCreateBuffer, clCreate ...

  8. macOS的OpenCL高性能计算

    随着深度学习.区块链的发展,人类对计算量的需求越来越高,在传统的计算模式下,压榨GPU的计算能力一直是重点. NV系列的显卡在这方面走的比较快,CUDA框架已经普及到了高性能计算的各个方面,比如Goo ...

  9. OpenCL的buffer以及sub-buffer

    buffer,sub-buffer和image对比 相同点:都是OCL memory对象 维度 特性关键词 buffer 一维 array of bytes sub-buffer 一维 views i ...

随机推荐

  1. [Swift]LeetCode10. 正则表达式匹配 | Regular Expression Matching

    Given an input string (s) and a pattern (p), implement regular expression matching with support for  ...

  2. [Swift]LeetCode287. 寻找重复数 | Find the Duplicate Number

    Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), pro ...

  3. Spring中你可能不知道的事(一)

    Spring作为Java的王牌开源项目,相信大家都用过,但是可能大家仅仅用到了Spring最常用的功能,Spring实在是庞大了,很多功能可能一辈子都不会用到,今天我就罗列下Spring中你可能不知道 ...

  4. 记一次尴尬的git reset丢失分支故障

    最近...似乎一直在踩坑... 也不是什么故障,只是把一个分支的功能弄没了,之后在reflog里找到又恢复了. 产生原因是有同事错误地把分支B merge到了分支A并push. 我直接在分支A上res ...

  5. python3+ selenium3开发环境搭建-手把手教你安装python(详细)

    环境搭建 基于python3和selenium3做自动化测试,俗话说:工欲善其事必先利其器:没有金刚钻就不揽那瓷器活,磨刀不误砍柴工,因此你必须会搭建基本的开发环境,掌握python基本的语法和一个I ...

  6. 【学习】在Windows10平台使用Docker ToolBox安装docker(一)

    前言:今天距离元旦还有44天,时间点是18:11:45,想了想一路学习的过程和其中遇到的困难,其中有克服的,有放弃的,这有可能是我自己意志不坚定吧,学习docker也是我当下的一个目标,不知道会是成功 ...

  7. .NET Core protobuf-net、MessagePack、Json.NET序列化/反序列化性能测试

    测试代码Zonciu/SerializationTest.cs, 源自neuecc/ZeroFormatterBenchmark.cs. NuGet包及其版本 mgravell/protobuf-ne ...

  8. js反爬-从入门到精通webdriver

    学习JS反爬 地址:http://openlaw.cn/login.jsp 想在指导案例中抓些内容,需要登陆 账号密码发送会以下面方式发送 所以需要找到_csrf和加密后的password,_csrf ...

  9. Java开发知识之XML文档使用,解析

    目录 XML文件详解 一丶XML简介 1.文档结构 2.XML中的元素(Element)或者叫做标签(Tab).属性 文本内容. 节点(Node) 3.XML语法规则 二丶XML文档解析 三丶使用XP ...

  10. REST API设计指导——译自Microsoft REST API Guidelines(三)

    前面我们说了,如果API的设计更规范更合理,在很大程度上能够提高联调的效率,降低沟通成本.那么什么是好的API设计?这里我们不得不提到REST API. 关于REST API的书籍很多,但是完整完善实 ...