• 设备与主机端的通信

    使用clCreateBuffer分配好内存,可以使用主机上已经存在的内容将其进行初始化,也可以先创建内存,再通过clEnqueueWriteBuffer,写数据,或者通过clEnqueueMapBuffer,将设备上的数据映射到主机端进行修改,修改后需要解映射,最后将分配好的内存,通过参数设置clSetKernelArg给到设备,如果数据改变了,则可以使用clEnqueueReadBuffer来读取数据,或者使用clEnqueueMapBuffer将内存映射到主机端进行访问,需要注意的是,在主机端对数据修改后,需要unmap,这样,设备端再次访问该数据的时候,就会是修改后的数据,否则访问未经解映射的内存,可能会读到预料不到的结果

clCreateBuffer函数用来给缓存对象分配内存,创建的内存可以是global、local、private,具体看kernel中怎么样声明限定符。
这里的buffer概念是用于kernel函数计算的,只有这里分配的内存可以用于kernel函数执行,其函数签名如下:

cl_memclCreateBuffer ( cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errcode_ret) 

cl_mem_flags参数可选项如下:
前面3个参数主要是限制设备在分配的内存上的可访问性

  • 1 CL_MEM_READ_WRITE:

    设备可以读写,host_ptr可为空,这表明该参数不需要初始化

  • 2 CL_MEM_WRITE_ONLY:

    设备只写,host_ptr可为空,表明不需要初始化

  • 3 CL_MEM_READ_ONLY:

    设备只读,不能为空
    下面的3个参数控制内存分配

  • 4 CL_MEM_USE_HOST_PTR:

    目的:在设备端处理缓存对象,并将缓存对象返回给主机,host_ptr指针不能为空(CL_MEM_USE_HOST_PTR优先采用在CPU端分配内存空间,让GPU端有访问权限,如果硬件不支持这种方式的话,则在GPU端开辟一块缓存,存储host_ptr里的内容)
    特点是主机和设备端都可以访问,
    类似于将主机上的内存块映射到设备上供设备使用,虽然是同一块内存,但是有可能在设备上对该
    内存操作了,在主机上访问的结果不正确,因此有可能需要对数据进行同步

  • 5 CL_MEM_COPY_HOST_PTR:

    目的:在设备端处理数据,也不需要将数据返回给主机
    在设备端分配内存,并将hsot_ptr指针指向的内存,拷贝size大小的数据到设备内存上去,
    host_ptr不能为空,由于是直接拷贝,因此在设备端对数据进行修改后,主机端不能够获取相应数据

  • 6 CL_MEM_ALLOC_HOST_PTR:

    目的:在主机可访问的地方分配内存,在设备端对数据进行初始化
    在该标志位下,opencl可能直接在固定内存上分配内存(而在固定内存上操作系统使用DMA进行数据传输 )

CL_MEM_ALLOC_HOST_PTR和CL_MEM_USE_HOST_PTR不能够同时使用

CL_MEM_ALLOC_HOST_PTR必须和CL_MEM_COPY_HOST_PTR一起使用,不能单独使用,他们联合起来可用于初始化主机可访问的内存块(如PCIe:新的总线和接口标准,主要优势是数据传输速率高),
这可能比使用CL_MEM_USE_HOST_PTR要速度快

clCreateBuffer分配的内存所指向的连续数据位置,在内核执行期间,内核都能够访问

  • 最后,总结一下:

cl_mem_flags参数的前三个使用来限制设备的读写权限的,而不是主机端读写权限
后三个参数中,如果主机端的数据直接传输后不需要再读取结果,就使用CL_MEM_COPY_HOST_PTR,
如果数据需要再读取回来,则可以使用CL_MEM_ALLOC_HOST_PTR和CL_MEM_COPY_HOST_PTR一起或者CL_MEM_USE_HOST_PTR

clCreateBuffer中cl_mem_flags参数解释相关推荐

  1. DG配置过程中的参数解释

    文章目录 DG配置过程中的参数解释: 1.DB_NAME 2.DB_UNIQUE_NAME 3.LOG_ARCHIVE_CONFIG 4.CONTROL_FILES 5.LOG_ARCHIVE_DES ...

  2. 执行计划中的参数解释

    执行计划中的各个参数解释: 一.Recursive calls (递归调用) 1.参考:Oracle Database Reference, 10g Release 2 (10.2).pdf第916页 ...

  3. 【Datapump】expdp和impdp中parallel参数解释

    在 expdp 和 impdp 中,可以通过并行( parallel 参数)来提高导出导入速率.这个参数会受到 cpu 和 I/O 影响.所以在使用 parallel 参数时,需要在资源消耗和运行时间 ...

  4. BasicLSTMCell中num_units参数解释

    https://blog.csdn.net/notHeadache/article/details/81164264

  5. 千千静听(TTplayer)中VBR音频格式转换中的参数解释

    r3mix ...............................................r 3个混合 standard ............................... ...

  6. caffe中solver.prototxt文件参数解释

    在训练或者微调网络时我们需要设置一些参数,在caffe中这些参数保存在sovler.prototxt文件中(当然这只是一个文件名,你也可以随意换成其他的名称).在下面的代码中以注释的形式解释每一个参数 ...

  7. Oracle 中control_file_record_keep_time参数的解释

    Oracle基于RMAN的备份方式,可分为以catalog 和nocatalog的两种方式进行备份管理.其中,catalog的方式需要一个catalog目录数据库,这个数据库一般运行在另外一台服务器上 ...

  8. mysql5.7命中率_MySQL5.7中 performance和sys schema中的监控参数解释(推荐)

    1.performance schema:介绍 在mysql5.7中,performance schema有很大改进,包括引入大量新加入的监控项.降低占用空间和负载,以及通过新的sys schema机 ...

  9. 【视频相关】视频中常出现的参数解释——2018年6月16日

    视频中常出现的参数解释 [帧 Frame] 帧速率(FPS,frame per second 帧率):每秒钟出现的帧数 由胶片概念的产生而出现,把静态的连续画面进行播放以达到动态影像需要每秒出现8格, ...

最新文章

  1. 元素多层嵌套,JS获取问题
  2. C++知识点62——模板实参推断与函数模板的特化
  3. Android Retrofit @Streaming 注解失效
  4. java arraystoreexception_208道高频 Java面试题答案6
  5. 前端趋势榜:上周最有意思、又实用的 10 大 Web 项目 - 210922
  6. elasticsearch索引模板
  7. 【转载】阿里云ECS服务器监控资源使用情况
  8. 九大现代病!中枪了吗?
  9. C#学习笔记(十四):StatusBar控件
  10. live555推流rtsp_Hi3518 RTSP推流
  11. leetcode5:最长回文子串
  12. 小区居民投诉要拆除通信基站 三大运营商联手“封杀”...
  13. 遇到一个php的错误,php初学者常见的几个错误及解决方法
  14. 数据库实验报告一-创建数据库和表
  15. 开源在线客服系统源码(支持PC/H5/公众号/小程序)基于golang的网页在线客服系统...
  16. 使用ArcGIS实现数据的随机选取
  17. 【Redis】练习题
  18. python爬虫可以爬取个人信息吗_手把手教你利用Python网络爬虫获取旅游景点信息...
  19. eclipse列名无效_sql 列名无效
  20. 烧心吃什么马上能缓解11 oracle,烧心吃什么马上能缓解

热门文章

  1. python爬虫爬取的数据与浏览器获取的数据不一样 爬虫爬取到的数据一直不变
  2. 聊聊Beaglebone Black的cape和device tree overlay和dtc命令【转】
  3. .NET接入UnionPay银联支付(一)手机wap支付
  4. Trips CodeForces - 1037E
  5. Codeforces 605E :Intergalaxy Trips
  6. 采药问题 c语言程序,采药 (C语言代码)
  7. JSON与JSONP
  8. 临床执业助理医师(综合练习)题库【9】
  9. 你知道Verilog HDL程序是如何构成的吗
  10. 机器视觉光源选型总结---颜色选择