OpenCL 中零拷贝的访问路径

2023-11-27

我对零拷贝到底是如何工作的有点困惑。

1-想要确认以下内容对应于opencl中的零复制。

 .......................
 .           .         .  
 .           .         .
 .           . CPU     . 
 .   SYSTEM  .         .
 .    RAM    . c3 X    .  
 .         <=====>     .  
 ...|...................
   PCI-E     / /
    |       / /
 c2 |X     /PCI-E, CPU directly accessing GPU memory
    |     / /                          copy c3, c2 is avoided, indicated by X. 
 ...|...././................
 .   MEMORY<====>          .
 .   OBJECT  .c1           . 
 .           .     GPU     .
 .   GPU RAM .             .  
 .           .             .  
 ...........................




 .......................
 .           .         .  
 .           .         .
 .           .   CPU   . 
 .SYSTEM RAM .         .
 .           .         .
 .           . c3      .  
 .    MEMORY<====>     .           
 ...| OBJECT............
    |     \  \   
   PCI-E   \  \PCI-E, GPU directly accessing System memory.  copy c2, c1 is avoided
    |       \  \
 C2 |X       \  \
 ...|.........\..\...........
 .  |        .              .
 .       <=======>          . 
 .   GPU    c1 X   GPU      .
 .   RAM     .              .  
 .           .              .  
 ............................

GPU/CPU 直接访问系统/GPU-RAM,无需显式复制。

2-拥有这个有什么好处? PCI-e 仍然限制整体带宽。 或者唯一的优点是我们可以避免在上述情况下复制 c2 和 c1/c3 ?


您对零拷贝工作原理的理解是正确的。基本前提是您可以从设备访问主机内存,也可以从主机访问设备内存,而无需在两者之间执行中间缓冲步骤。

您可以通过使用以下标志创建缓冲区来执行零复制:

CL_MEM_AMD_PERSISTENT_MEM //Device-Resident Memory
CL_MEM_ALLOC_HOST_PTR // Host-Resident Memory

然后,可以使用内存映射语义来访问缓冲区:

void* p = clEnqueueMapBuffer(queue, buffer, CL_TRUE, CL_MAP_WRITE, 0, size, 0, NULL, NULL, &err);
//Perform writes to the buffer p
err = clEnqueueUnmapMemObject(queue, buffer, p, 0, NULL, NULL);

使用零拷贝,您可以获得比执行以下操作的实现更高的性能:

  1. 将文件复制到主机缓冲区
  2. 将缓冲区复制到设备

相反,您可以一步完成这一切

  1. 内存映射设备端缓冲区
  2. 将文件从主机复制到设备
  3. 取消映射内存

在某些实现上,映射和取消映射的调用可以隐藏数据传输的成本。就像我们的例子一样,

  1. Memory Map设备端缓冲区【实际上创建了一个相同大小的主机端缓冲区】
  2. 将文件从主机复制到设备[实际写入主机端缓冲区]
  3. 取消映射内存[实际上是通过 clEnqueueWriteBuffer 将数据从主机缓冲区复制到设备缓冲区]

如果实现以这种方式执行,那么使用映射方法将没有任何好处。然而,AMD 的 OpenCL 较新驱动程序允许直接写入数据,使得映射和取消映射的成本几乎为 0。对于独立显卡,请求仍然通过 PCIe 总线进行,因此数据传输可能会很慢。

然而,在 APU 架构的情况下,由于 APU 独特的架构(如下图所示),使用零复制语义的数据传输成本可以大大提高传输速度。在此架构中,PCIe 总线被统一北桥 (UNB) 取代,从而实现更快的传输。

BE AWARE当使用带有内存映射的零拷贝语义时,当从主机读取设备端缓冲区时,您将看到绝对可怕的带宽。这些带宽约为 0.01 Gb/s,很容易成为代码的新瓶颈。

抱歉,如果信息太多。这是我的论文题目。

APU Architecture

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCL 中零拷贝的访问路径 的相关文章

  • 确定 OpenCL 工作组大小的限制因素?

    我正在尝试在资源较少的嵌入式 GPU 上运行一些为桌面显卡编写的 OpenCL 内核 特别是 桌面版本假设始终支持至少 256 个工作组大小 但基于 Mali T628 ARM 的 GPU 仅保证 64 工作组大小 事实上 一些内核报告CL
  • OpenCL 内核未矢量化

    我正在尝试构建一个内核来进行并行字符串搜索 为此 我倾向于使用有限状态机 fsm 的转换表位于内核参数状态中 代码 kernel void Find constant char text const int offset const int
  • OpenCL 中的最佳本地/全局工作规模

    我想知道如何在 OpenCL 中为不同设备选择最佳的本地和全局工作大小 AMD NVIDIA INTEL GPU 有什么通用规则吗 我是否应该分析设备的物理构建 多处理器数量 多处理器中的流处理器数量等 这取决于算法 实现吗 因为我看到一些
  • 性能:boost.compute vs. opencl C++ 包装器

    以下代码分别使用 boost compute 和 opencl C 包装器将两个向量相加 结果显示 boost compute 几乎比 opencl c 包装器慢 20 倍 我想知道我是否错过了使用 boost compute 或者它确实很
  • opencl中的时钟()

    我知道CUDA中有一个函数clock 你可以在其中放入内核代码并查询GPU时间 但我想知道OpenCL中是否存在这样的东西 有没有办法查询OpenCL中的GPU时间 我正在使用 NVIDIA 的工具包 OpenCL 没有直接查询时钟周期的方
  • OpenCL 内核是异步执行的吗?

    对于 CUDA 我知道它们是在向默认流 空流 发出启动命令后异步执行的 那么在 OpenCL 中又如何呢 示例代码如下 cl context context cl device id device id cl int err cl kern
  • OpenCL 产生错误的计算

    我一直尝试使用openCL做一些计算 但结果不正确 我输入了三个 float3 如下所示 300000 0 0 300000 300000 0 300000 300000 300000 进入这个内核 kernel void gravitat
  • opencl支持布尔变量吗?

    openCL 支持布尔变量吗 我目前正在使用 JOCL java 编写我的 openCL 调用代码 但我没有看到任何有关布尔值的信息 tl dr 是的 但是你应该在内核函数签名中避免它 是的 但a的大小bool is not定义的 因此 它
  • 如何消除 opencl 代码中的 CL_INVALID_PLATFORM 错误?

    使用 OpenCL 进行简单的矩阵乘法 Multiply two matrices A B C include
  • boost::计算流压缩

    如何使用 boost compute 进行流压缩 例如 如果您只想对数组中的某些元素执行繁重的操作 首先 生成掩码数组 其中包含与要执行操作的元素相对应的元素 mask 0 0 0 1 1 0 1 0 1 然后对掩码数组进行排它扫描 前缀和
  • 在 Windows 8 (x64) 中安装期间出现 PyOpenCL“致命错误:CL/cl.h:没有此类文件或目录”错误

    在大量搜索此问题的解决方案后 我发现此特定错误尚未针对 Windows 正确记录 所以我决定将这个问题与解决方案一起发布 抱歉 如果我将其发布在错误的部分 我希望这个解决方案能够帮助用户解决未来 PyOpenCL 安装错误 请注意 此处使用
  • 使用 OpenCL 或其他 GPGPU 框架在现代 x86 硬件上的 CPU 和 GPU 之间共享数据

    AMD Kaveri 的 hUMA 异构统一内存访问 和 Intel 第四代 CPU 证明了 CPU 和 GPU 硬件的不断统一 应该允许 CPU 和 GPU 之间进行无副本的数据共享 我想知道 最新的 OpenCL 或其他 GPGPU 框
  • 杀死 OpenCL 内核

    有没有办法通过 OpenCL API 终止正在运行的 OpenCL 内核 我在规范中没有找到任何内容 我能想到的唯一解决方案是 1 定期检查内核中主机希望内核停止时写入的标志 或 2 在单独的进程中运行内核并终止整个进程 我认为这两个都不是
  • OpenCL 矩阵乘法应该更快?

    我正在尝试学习如何使 GPU 优化 OpenCL 内核 我以使用本地内存中的方形图块进行矩阵乘法为例 然而在最好的情况下 我只得到了约 10 倍的加速 约 50 Gflops 与 numpy dot 相比 5 Gflops 它使用的是 BL
  • 如何在 C 中将向量参数传递给 OpenCL 内核?

    我在将向量类型 uint8 参数从 C 中的主机代码传递到 OpenCL 内核函数时遇到问题 在主机中 我将数据存储在数组中 cl uint dataArr 8 1 2 3 4 5 6 7 8 我的真实数据不仅仅是 1 8 这只是为了便于解
  • OpenCL 与 OpenMP 性能对比 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否有研究比较 OpenCL 与 OpenMP 的性能 具体来说 我对使用 OpenCL 启动线程的开销成本感兴趣 例如 如果将域分解
  • 如何在 Emgu CV 项目中利用 OpenCL

    我是使用 Emgu CV 的新手 并开始创建小型示例项目 例如面部检测 眼睛检测等 如果我可以利用 OpenCL 来加速使用 GPU 的过程 那就太好了 否则 当我降低scaleFactor时 它会导致大量的CPU利用率 我怎样才能做到这一
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • OpenCL 内核在 Nvidia GPU 上每个线程使用多少寄存器?

    我的第一个问题是如何获取 Nvidia GPU 上 OpenCL 内核代码的寄存器使用信息 因为 nvcc 编译器给出了相同的使用信息nvcc ptxas options vCUDA 内核代码的标志 我还从 AMD GPU for Open
  • 尽管有障碍,Open CL 仍不同步

    我刚刚开始通过 Python 的 PyOpenCL 接口使用 OpenCL 我尝试创建一个非常简单的 循环 程序 其中每个内核中每个循环的结果取决于上一个循环周期的另一个内核的输出 但我遇到了同步问题 kernel void part1 g

随机推荐

  • 如何使用 C 函数执行 Shell 内置命令?

    我想通过像 execv 这样的 C 语言函数来执行 Linux 命令 pwd 问题是没有名为 pwd 的可执行文件 并且我无法执行 echo PWD 因为 echo 也是一个内置命令 找不到可执行文件 如果你只想在你的c程序中执行shell
  • 如何将自定义属性添加到 Magento 中的客户组?

    我们使用的是 Magento CE 1 7 0 0 我们正在尝试向客户组实体添加新属性 我们已使用以下安装脚本成功向客户添加自定义属性
  • Javascript/Regex 用于仅查找没有子域的根域名

    我进行了搜索 发现了很多类似的正则表达式示例 但不完全是我需要的 我希望能够传入以下网址并返回结果 www google com回报谷歌网站 子域名 are cool google com回报谷歌网站 并不重要子域名的长度如何 idont
  • BASH下运行的程序的颜色输出[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我需要能够使终端上的一些文本更加引人注目 我的想法是使文本着色 要么是实际的文本 要么是每个字母的矩形中的空间 想想 vi 的光标 我认为对我的应用程序重要的唯一两个额外规范是
  • 在我的 css 类中使用 Zoom:1 可以吗?

    每当我发现 IE 显示我的网站很奇怪 与 Chrome 和 Firefox 不同 时 我会尝试放置zoom 1在 css 类中显示奇怪的部分 很多时候这可以解决问题并使其看起来与其他浏览器一致 使用有问题吗zoom 1 我知道我的 CSS
  • CFMessagePort 和沙箱

    我正在调整 MacOS 应用程序以使用沙箱 它使用一个辅助应用程序 同一包中的 exe 当我尝试在控制台中使用 拒绝 mach lookup 消息调用 CFMessagePortCreateRemote 时 该应用程序会失败 我可以看到co
  • PHP mb_ereg_replace 未替换,而 preg_replace 按预期工作

    我正在尝试将字符串中所有非单词字符替换为空字符串 除了空格 并将所有多个空格放在一起作为一个空格 以下代码执行此操作 cleanedString preg replace w name cleanedString preg replace
  • 将 numpy 中数组元素的所有组合相乘

    注意 我对 只需使用 for 循环进行操作 之类的答案不感兴趣 我想以 numpyish 的方式进行操作 我是 Python 初学者 我想使用 numpy ndarray 执行以下操作 给定一个数字序列t和另一个数字序列b 对于每一个t i
  • Asyncio 检测断开连接挂起

    我在 Python 3 4 中使用 Asyncio 我将尝试解释到目前为止我正在做的事情以及我 认为 导致问题的原因 一方面 我有一个具有阻塞操作的 UDP 连接框架 我将从该流中获取的数据创建为 SSE 格式传递给客户端的 json 这一
  • 从 Brocfile 的构建中排除文件夹

    有没有办法从 Brocfile 或任何其他地方 的构建中排除文件夹 用例是打包 我有一个由 pod 内的子应用程序组成的应用程序 例如 app modules components app modules app1 app modules
  • jquery中有没有办法将点击事件绑定到div的左边框?

    我有一个div div div 有没有办法将点击事件绑定到这个div的左边框 提前致谢 div height 100px border 4px solid black padding 10px 请尝试这个方法 div click funct
  • Python 中的浏览文件或目录对话框

    我正在用 Python 做一个小项目 我想浏览文件或目录以获取它们的路径 我正在使用 Tkinter 但只能找到一个文件浏览器 filename tkFileDialog askopenfilename parent root title
  • Read.csv() 抛出错误

    我一直在尝试读取 Excel 文件 但似乎有问题 该文件以 Excel 格式存储在 Documents 文件夹中 这些是我收到的错误消息 table lt read csv file choose header T sep t Warnin
  • 使用 MongoDB 制作类似 Twitter 的时间线

    我需要的 假设您正在使用 MongoDB 并且有一个名为users 每个用户都有一个 以下 数组 其中包含 user id他所关注的人的信息 然后你就有了另一个收藏statuses 每个状态包含 id它的作者 如何向某个用户显示他所关注的人
  • Netty 4 中的缓冲区所有权:如何管理缓冲区生命周期?

    我一直在尝试编写一个 HTTP 客户端来同时获取多个提要 最多 1k 同时也是学习 Netty 4 的练习 我的问题是 是否有关于新 ByteBuf 基础设施如何工作的很好的解释 谁 拥有 它们 它们如何共享 是吗 ChannelPipel
  • 如何设置热图中的中心颜色

    我想在seaborn 中绘制热图 我的代码如下 plt rcParams font size 13 plt rcParams font weight bold my dpi 96 fig ax plt subplots figsize 80
  • C# 代表现实世界的用法 [重复]

    这个问题在这里已经有答案了 我之前问过一个关于委托的问题 是否有人有一个必须使用委托的场景 这如何改进我的 C 代码 正如我使用它的许多场景一样 我似乎总是能够围绕它进行编程 每当您使用策略模式或者观察者模式 委托使您的工作比使用接口更容易
  • 在没有 Apple Developer Program (Xcode 7) 的情况下在 iOS 上安装应用程序

    6 月 8 日 Apple 宣布通过 Xcode 7 每个人都可以在自己的设备上安装他们开发的任何应用程序 而无需 Apple 开发者计划证书 Apple 开发者网站称您只需使用 Apple ID 登录即可 我已经在 Xcode 上做到了这
  • GroupMe 如何验证我的号码?

    我正在开发一个 iPhone 应用程序 我需要用户的电话号码 根据我读到的内容 例如这里 在 iOS 中以编程方式获取自己的电话号码 设备的电话号码在您的应用程序容器中不可用 我总是让用户输入他或她自己的号码 但是 当我前几天加入 Grou
  • OpenCL 中零拷贝的访问路径

    我对零拷贝到底是如何工作的有点困惑 1 想要确认以下内容对应于opencl中的零复制 CPU SYSTEM RAM c3 X lt gt PCI E c2 X PCI E CPU directly accessing GPU memory