clCreateBuffer和clCreateBuufer + clEnqueueWriteBuffer
有两种方式实现从主机到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的更多相关文章
- 【异构计算】OpenCL矩阵转置
介绍 矩阵转置,主要的技巧还是利用好local memory ,防止local memory,以及glabol memory的读取尽量是合并读写. 完整代码一: main.cpp代码 #include ...
- OpenCL将数组从内存copy到显存
本来想对上一篇博客做优化,优化效果不明显.但知识点还是要记一下. 初衷是想把上一篇博客中定义域的计算搬到CPU来计算,因为定义域的计算对于每一个kernel都是一样的,所以直接读取应该是可以进一步减小 ...
- Opencl 并行求和
上周尝试用opencl求极大值,在网上查到大多是求和,所谓的reduction算法.不过思路是一样的. CPP: ; unsigned ; ; ; int nGroup = nGroupSize / ...
- opencl初体验
总结一下,opencl的步骤差不多是这些 先要获取平台的id clGetPlatformIDs(nPlatforms, platform_id, &num_of_platforms) 然后获取 ...
- Mac OS X 背后的故事
Mac OS X 背后的故事 作者: 王越 来源: <程序员> 发布时间: 2013-01-22 10:55 阅读: 25840 次 推荐: 49 原文链接 [收藏] ...
- about opencl
Platform:LG G3,Adreno 330 1. 8M(3264x2448) memmap方式读入时间24ms,读出时间12ms,时间与内存大小基本成线性关系.使用memmap 与 memco ...
- OpenCL memory object 之 Global memory (2)
转载自:http://www.cnblogs.com/mikewolf2002/archive/2011/12/18/2291584.html 当我们用clCreateBuffer, clCreate ...
- macOS的OpenCL高性能计算
随着深度学习.区块链的发展,人类对计算量的需求越来越高,在传统的计算模式下,压榨GPU的计算能力一直是重点. NV系列的显卡在这方面走的比较快,CUDA框架已经普及到了高性能计算的各个方面,比如Goo ...
- OpenCL的buffer以及sub-buffer
buffer,sub-buffer和image对比 相同点:都是OCL memory对象 维度 特性关键词 buffer 一维 array of bytes sub-buffer 一维 views i ...
随机推荐
- [Swift]LeetCode236. 二叉树的最近公共祖先 | Lowest Common Ancestor of a Binary Tree
Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...
- [Swift]LeetCode906. 超级回文数 | Super Palindromes
Let's say a positive integer is a superpalindrome if it is a palindrome, and it is also the square o ...
- 6.Git基础-远程仓库的使用
远程仓库是指托管在因特网或其他网络中的你的项目的版本库.比如你在GitHub中托管的代码库,就是远程仓库. 1.查看远程仓库 -- git remote git remote 查看已经配置的远程仓 ...
- webpack的基本配置项
const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin& ...
- vue实例属性的方法
1.$mount() 手动设置挂载点 eg:vm.$mount("#app") 2.$destroy() 销毁 eg:vm.$destroy(); 3.$forceUp ...
- ThinkPHP 数据库操作(六) : 查询事件、事务操作、监听SQL
查询事件 查询事件(V5.0.4+) 从 5.0.4+ 版本开始,增加了数据库的CURD操作事件支持,包括: 查询事件仅支持 find . select . insert . update 和 del ...
- 【Spark篇】---SparkStreaming+Kafka的两种模式receiver模式和Direct模式
一.前述 SparkStreamin是流式问题的解决的代表,一般结合kafka使用,所以本文着重讲解sparkStreaming+kafka两种模式. 二.具体 1.Receiver模式 原理图 ...
- zabbix系列之十——添加短信告警
zabbix添加短信告警 1.查看zabbix-server脚本存放路径: [root@GYQ-Prod-Zabbix ~]# grep AlertScriptsPath /etc/zabbix/za ...
- redis 系列9 对象类型(字符串,哈希,列表,集合,有序集合)与数据结构关系
一.概述 在前面章节中,主要了解了 Redis用到的主要数据结构,包括:简单动态字符串.链表(双端链表).字典.跳跃表. 整数集合.压缩列表(后面再了解).Redis没有直接使用这些数据结构来实现键值 ...
- Linq用法小记
一.什么是Linq? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特性. ...