首页 > 其他分享 >opencl优化-Zero Copy

opencl优化-Zero Copy

时间:2022-12-16 14:44:47浏览次数:60  
标签:CL Copy cl MEM opencl buffer Zero sizeof NULL

转自:https://www.cnblogs.com/willhua/tag/OpenCL/

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

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

第二种:

 1 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的应用
 1 // First set cl_mem_flags input in clCreateBuffer:
 2 cl_mem Buffer = clCreateBuffer(context,
 3     CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR,
 4     sizeof(cl_ushort) * size,
 5     NULL,
 6     &status);
 7 //Then use the map function to return a pointer to the host:
 8 cl_uchar *hostPtr = (cl_uchar *)clEnqueueMapBuffer(
 9     commandQueue,
10     Buffer,
11     CL_TRUE,
12     CL_MAP_WRITE,
13     0,
14     sizeof(cl_uchar) * size,
15     0, NULL, NULL, &status);
16 
17 //Host updates the buffer using the pointer hostPtr
18     memcpy(hostPtr, sizeof(cl_uchar) * size, datafromhost);
19     
20 //Unmapped the object
21 status = clEnqueueUnmapMemObject(
22     commandQueue,
23     Buffer,
24     (void *) hostPtr,
25     0, NULL, NULL);
26     
27 //The object can be used by OpenCL kernels

 

标签:CL,Copy,cl,MEM,opencl,buffer,Zero,sizeof,NULL
From: https://www.cnblogs.com/peifx/p/16987327.html

相关文章

  • LTspice: Copy and Paste Between Schematics
    不得不说LTSpice真的是界面方面太不Friendly了,这个问题让我抓狂了一下午,不过最终还是再官网找到了答案关键的诀窍就是copy后不要点击左键然后直接点击另外一个原理图窗口......
  • opencl 学习kernel,work_item和workgroup,工作组,工作项的理解
    https://zhuanlan.zhihu.com/p/558573914https://www.cnblogs.com/biglucky/p/3755189.html转载自:http://www.cmnsoft.com/wordpress/?p=1429前几节我们一起学习了几个......
  • opencl 教程
    这是第一篇真正的OpenCL教程。这篇文章不会从GPU结构的技术概念和性能指标入手。我们将会从OpenCL的基础API开始,使用一个小的kernel作为例子来讲解基本的计算管理。首先我......
  • 浅析BeanUtils中copyProperties原理
    摘要本文浅析BeanUtils中copyProperties的原理。简述大致实现流程源码浅析org.springframework.beans.BeanUtils/***将给定源bean的属性值赋值到目标bean中。*......
  • 置0函数memset/bzero性能分析
    目录​​memset​​​​实现​​​​bzero​​​​实现​​​​memset和bzero对比​​​​参考​​memset实现bzero实现memset和bzero对比参考https://www.jb51.net/art......
  • OpenCL错误码
    错误描述CL_SUCCESS命令成功执行,没有出现错误CL_DEVICE_NOT_FOUND未发现与条件匹配的OpenCL设备CL_DEVICE_NOT_AVAILABLEOpenCL设备目前不可用CL_COMPILER_NOT_AVA......
  • CopyOnWriteArrayList的使用和优缺点
    CopyOnWriteArrayList允许并发读,读操作无锁,性能较高;而写操作(含删除),比如向容器中添加/删除一个元素,则首先将当前容器复制一份,然后在新副本上执行写操作,结束之后再将原容......
  • 【collection】4.java容器之LinkedList,Stack,CopyOnWriteArrayList
    LinkedList节点数据结构/***泛型结构*@param<E>node*/privatestaticclassNode<E>{ Eitem; //双向链表,向前和向后 Node<E>next; Node<E>prev; N......
  • Leela Chess Zero
    LeelaChessZero-ChessprogrammingwikiLeelaChessZeroisinitiatedandannouncedbyStockfishco-authorGaryLinscott.LeelaChessisopensource.Thegoal......
  • matlab/simulink中如何使用ones/zeros(变量,变量)不报错
    1.脚本声明变量%使用脚本声明结构体变量m并创建simulink.busclcclearm.a1=[333];busInfo=Simulink.Bus.createObject(m);2.在simulink中使用ones报......