GPU - 系统内存映射

2024-02-25

如何映射系统内存 (RAM) 以供 GPU 访问?我很清楚虚拟内存如何为 cpu 工作,但不确定当 GPU 访问 GPU 映射的系统内存(主机)时,虚拟内存如何工作。基本上与数据如何从系统内存复制到主机内存以及反之亦然有关。您能提供有参考文章支持的解释吗?


我发现以下幻灯片非常有用:http://developer.amd.com/afds/assets/presentations/1004_final.pdf http://developer.amd.com/afds/assets/presentations/1004_final.pdf

Fusion APUS 上的内存系统 零拷贝的好处 皮埃尔·布迪埃 AMD OpenGL/OpenCL 院士 格雷厄姆·塞勒斯 AMD OpenGL 管理器

AMD Fusion 开发者峰会 2011 年 6 月

但请注意,这是一个快速变化的区域。与其说是开发新概念,不如说是(最终)将虚拟内存等概念应用到 GPU 上。让我总结一下。

在过去,比如 2010 年之前,GPU 通常是单独的 PCI 或 PCI-express 卡或板。他们的 GPU 卡上装有一些 DRAM。这个板载 DRAM 速度相当快。他们还可以访问 CPU 端的 DRAM,通常通过 PCI 上的 DMA 复制引擎。像这样的 GPU 访问 CPU 内存的速度通常相当慢。

GPU 内存未分页。就此而言,GPU 内存通常是不缓存的,除了 GPU 内部软件管理的缓存(例如纹理缓存)之外。 “软件管理”意味着这些缓存不是缓存一致的,必须手动刷新。

通常,GPU 仅访问 CPU DRAM 的一小部分(孔径)。通常,它是固定的 - 不受寻呼的影响。通常,甚至不需要进行虚拟地址转换 - 通常虚拟地址=物理地址,+可能是一些偏移量。

(当然,CPU内存的其余部分是正确的虚拟内存,分页,当然翻译和缓存。只是GPU无法安全地访问它,因为GPU确实(没有)无法访问虚拟内存子系统和缓存连贯性系统。

现在,上述方法有效,但很痛苦。首先在 CPU 内操作,然后在 GPU 内操作,速度很慢。容易出错。还有一个很大的安全风险:用户提供的 GPU 代码通常可以访问(缓慢且不安全)所有 CPU DRAM,因此可能被恶意软件使用。

AMD 宣布了更紧密地集成 GPU 和 CPU 的目标。第一步是创建“Fusion”APU,即包含 CPU 和 GPU 的芯片。 (英特尔在 Sandybridge 上做了类似的事情;我预计 ARM 也会这样做。)

AMD还宣布他们打算让GPU使用虚拟内存子系统,并使用缓存。

AMD IOMMU 是让 GPU 使用虚拟内存的一个步骤。英特尔也有类似的。尽管 IOMMU 比非虚拟机操作系统的虚拟内存更面向虚拟机。

CPU 和 GPU 位于同一芯片内的系统通常使 CPU 和 GPU 访问相同的 DRAM 芯片。因此不再有“GPU 板上”和“GPU-CPU 外”DRAM。

但通常系统主板上的DRAM仍然会被分割、分区为主要供CPU使用的内存和主要供GPU使用的内存。尽管内存可能位于相同的 DRAM 芯片内,但通常很大一部分是“图形”。由于历史原因,在上面的论文中,它被称为“本地”内存。 CPU 和图形内存的调整可能有所不同 - 通常 GPU 内存的优先级较低(视频刷新除外),并且具有较长的突发。

在我向您推荐的论文中,有不同的内部总线:洋葱用于“系统”内存,“大蒜”用于更快地访问图形内存分区。 Garlic 内存通常是未缓存的。

我参考的论文讨论了CPU和GPU如何具有不同的页表。他们的副标题“零复制的好处”是指将 CPU 数据结构映射到 GPU 页表中,这样您就不需要复制它。

等等等等,

该系统的这一领域正在迅速发展,因此 2011 年的论文几乎已经过时了。但你应该注意趋势

(a) 软件希望统一访问CPU和GPU内存——虚拟内存和可缓存

but

(b) 尽管硬件试图提供 (a),但特殊的图形内存功能几乎总是使专用图形内存(即使只是相同 DRAM 的一个分区)显着更快或更节能。

差距可能正在缩小,但每当你认为差距即将消失时,就可以玩另一个硬件技巧。

—-

顺便说一句,这个 2012 年的答案应该更新——我是在 2019 年写这篇文章的。很多内容仍然适用,例如 tge CPU/GPU 内存的区别。 GPU 内存的速度仍然更高,但现在 GPU 内存通常比 CPU 更多,至少在数据中心深度学习系统中是这样。在家用电脑中则不然。此外,GPU 现在支持虚拟内存。这绝不是完整的更新。

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

GPU - 系统内存映射 的相关文章

  • 用于计算邻居列表的最佳 GPU 算法

    给定 3D 中数千个点的集合 我需要获取落在某个截止值 以欧几里得距离而言 内的每个粒子的邻居列表 并且如果可能的话 从最近到最远排序 在 CUDA 或 OpenCL 语言中 哪种 GPU 算法最快 我所知道的最快的 GPU MD 代码之一
  • gpg:抱歉,根本没有请求终端 - 无法获取输入

    解密时出现以下错误 eyaml decrypt s ENC and the key goes on here gnupg quiet no secmem warning no permission warning no tty yes de
  • 如何在服务器上保存用户凭据以在后台运行查询

    背景 我们有一个 ASP NET Silveright Web 应用程序 silverlight客户端显示用户 图形形式的特定数据 它从服务器请求数据 问题 由于服务器必须执行底层数据库查询 获取这些数据的成本很高 因此客户端必须等待 优化
  • 设备内存刷新cuda

    我正在运行一个 C 程序 其中调用了两次 cuda 主机函数 我想清理这两个调用之间的设备内存 有没有办法可以刷新 GPU 设备内存 我使用的是计算能力为2 0的Tesla M2050 如果你只想将内存归零 那么cudaMemset可能是最
  • 从另一个命令 Handle() 方法中调用命令

    嗨 我正在使用简易注射器 https simpleinjector orgDI 库并一直在关注一些关于围绕命令模式设计的架构模型的非常有趣的材料 同时 在我的架构的命令方面 https cuttingedge it blogs steven
  • 电路解码所需的最小输入位数

    我正在学习计算机体系结构 并且正在阅读有关编码器和解码器的内容 在 MIPS 处理器中 操作码有 6 位 我想知道构建解码器来解码操作码需要多少输入位 我知道解码器是一个组合电路 它将二进制信息从 n 个输入线转换为最多 2 n 个唯一的输
  • 如何设计流星智能包以透明地将应用程序分离到不同的实例中?

    这是对于那些非常熟悉 Meteor 架构的人来说的问题 我正在尝试设计一个智能包 可以透明地运行 Meteor 应用程序的多个 副本 也就是说 给定一个现有的 Meteor 应用程序和几个预定义的用户组 该包可以半自动地 隔离 该应用程序
  • 我们如何在每次运行时使用不同的种子在 CUDA C 中生成随机数?

    我正在研究一个随机过程 我想在每次运行程序时在 CUDA 内核中生成不同的系列随机数 这类似于我们在 C 中声明 种子 时间 空 接下来是 srand 种子 和兰特 我可以通过内核将种子从主机传递到设备 但是 这样做的问题是我必须将整个种子
  • SQL Server 中数据库数量的实际限制?

    在 stackoverflow 播客之一 我认为是 18 中 Jeff 和 Joel 正在讨论多租户数据库与单租户数据库 Joel 提到 FogBugz on Demand 使用了每个客户架构的数据库 我想知道是否有一个点超过这个点 您将需
  • 为什么“raise IOError(“无法识别图像文件”)”仅在部分时间出现?

    我写了一个小程序 从下载最新的每日潮汐图NOAA http tidesandcurrents noaa gov 向包含潮汐信息的图像添加文本表 然后将此图像设置为我的桌面壁纸 from bs4 import BeautifulSoup im
  • 返回地址预测堆栈缓冲区与堆栈存储的返回地址?

    一直在阅读 Agner Fog 的 Intel AMD 和 VIA CPU 的微架构 他在第 34 页描述了 返回地址预测 http www agner org optimize microarchitecture pdf http www
  • 从文件中获取InputStream,该文件可能位于(或不位于)类路径中[重复]

    这个问题在这里已经有答案了 只是想知道哪种方法是读取类路径中的文件的最佳方法 我唯一拥有的是带有文件路径的属性 举个例子 文件路径 类路径 com mycompany myfile txt 文件路径 文件 myfolder myfile t
  • C# 写入文件的性能

    我的情况概述 我的任务是从文件中读取字符串 并将它们重新格式化为更有用的格式 重新格式化输入后 我必须将其写入输出文件 这是必须完成的操作的示例 文件行示例 ANO 2010 CPF 17834368168 YEARS 2010 2009
  • 如何使用用户输入变量作为通用包的参数?

    In Stack adb我指定了两个参数 大小和类型 我想创建一个堆栈 该堆栈的数据类型与用户在我的堆栈中指定的数据类型完全相同multistack adb file 我似乎找不到一种方法来创建新的包或使用用户定义的堆栈类型变量来实例化堆栈
  • 使用覆盖率信息测试 Go 中的 os.Exit 场景 (coveralls.io/Goveralls)

    这个问题 如何在 Go 中测试 os exit 场景 https stackoverflow com questions 26225513 how to test os exit scenarios in go 以及其中得票最高的答案 列出
  • 为什么上升沿优于下降沿

    触发器 寄存器 通常由上升沿或下降沿触发 但大多数情况下 您会在代码中看到使用上升沿触发的 if 子句 事实上 我从未见过有下降沿的代码 这是为什么 是因为程序员自然而然地使用上升沿 因为他们习惯了 还是因为某些物理 模拟定律 事实 上升沿
  • 什么是输入流和输出流?我们为什么以及何时使用它们?

    有人向我解释一下什么InputStream and OutputStream are 我对两者的用例感到困惑InputStream and OutputStream 如果您还可以包含一段代码来配合您的解释 那就太好了 谢谢 目标是Input
  • nvidia GPU 上的内核真的有超时吗?

    寻找为什么我的内核产生奇怪的错误消息或仅 0 结果的答案我发现了这个answer https stackoverflow com questions 3988645 cl out of resources for 2 millions fl
  • Mxnet - 缓慢的数组复制到 GPU

    我的问题 我应该如何在 mxnet 中执行快速矩阵乘法 我的具体问题 数组复制到 GPU 的速度很慢 对此我们能做些什么呢 我创建随机数组 将它们复制到上下文中 然后相乘 import mxnet as mx import mxnet nd
  • 通过 SO_RCVTIMEO 套接字选项在 Ruby 中设置套接字超时

    我试图通过 SO RCVTIMEO 套接字选项在 Ruby 中设置套接字超时 但它似乎对任何最近的 nix 操作系统都没有影响 使用 Ruby 的 Timeout 模块不是一个选择 因为它需要为每个超时生成和连接线程 这可能会变得昂贵 在需

随机推荐

  • 查看监听集合事件

    我有一个看法myView和一个集合myCollection 当我add一个模型myCollection the add事件被触发myCollection 我怎样才能拥有myView听听那个add event 您可以在实例化集合时将集合传递给
  • Android:RadioButton Toast 中的帮助

    如果用户单击 下一步 按钮而不选择选项 则必须显示一条消息 请选择任何一个 否则它应该转到下一个屏幕 我已经尝试过 但它不会进入下一个屏幕 而是显示吐司 请选择任何一个 和我的代码 public class Question1 extend
  • Vue - 添加 CDN 组件,无需 webpack

    我想添加this https cdn jsdelivr net npm vuejs auto complete 0 9 0 dist build js不使用 webpack 的情况下将组件添加到我的 Vue js 项目中 我尝试将其添加到h
  • BlackBerry 线程模型

    我读过很多评论 其中提到 BlackBerry 线程模型偏离了 Java 标准 可能会导致问题 但无论进行多少次谷歌搜索都没有让我明白这到底意味着什么 我一直在为 BlackBerry 开发一个相当大的业务应用程序 尽管我以前没有任何 Ja
  • 通过 Gmail 发送带有自定义方案的链接

    我正在尝试发送打开我的 Android 应用程序的深层链接 String body a href Link to simulation a Intent emailIntent new Intent android content Inte
  • Android 中的默认录音

    我注意到 Android 默认录音机可以感知你的声音有多大在 UI 参数中向您展示 http www androidtapp com wp content uploads 2009 08 OI Shopping Voice Recordin
  • 实际上如何使用 GraphStream 在 swing 中绘制图形?

    我正在尝试实现绘图秋千内的教程图 http graphstream project org doc Tutorials Graph Visualisation 1 1 integrating the viewer in your gui 但
  • 如何创建 Visual Studio Code Python 工作区?

    我正在尝试在 macOS 上的 Visual Studio Code 上设置 Python 我的计算机上安装了 Python 2 7 和 3 5 解释器 当我尝试创建我的第一个 Python 文件时 import未找到模块 根据我看到的各种
  • 从桌面应用程序进行身份验证

    我正在构建一个 Windows 服务 该服务会在某些条件下将文件上传到 Box com 如何在用户不访问网页并输入用户名和密码的情况下进行身份验证 我似乎无法在文档中找到详细信息 thanks 目前 您有两种选择 您可以注册 即时模式 测试
  • 错误 React.Children.only 期望接收单个 React 元素子元素

    不完全确定我的应用程序出了什么问题 我正在使用 create react app 并且尝试将所有组件渲染到相应的根 div 中 问题是 我能够将所有组件渲染到页面上 除了最后一个组件 分数组件 我什至尝试将该组件放入 div 中 但仍然遇到
  • 如何在 OpenGL 中设置文本颜色

    我是 openGL 的新手 想设置文本颜色 尝试了 glColor3f 函数 但它改变了绘图颜色 因为我只想改变文本颜色 我该怎么办 您可以将当前颜色压入属性堆栈 更改颜色 绘制文本 然后弹出堆栈以恢复原始颜色 glPushAttrib G
  • 标记多个日期动态反应原生wix

    我正在使用反应本机日历 一旦标记参数传递给日历对象 该库就提供了在日历上标记日期的能力 我尝试传递一个对象数组 但没有成功发送多个日期 如下所示也不起作用 如何动态标记多个日期呢 var nextDay 2018 06 01 2018 06
  • 如何在 Java 中与两(2)个 SwingWorker 类共享数据

    我有两个 SwingWorker 类 FileLineCounterThread and FileDivisionThread 我将执行这两个线程 当行计数线程完成时 它将结果传递给文件分割线程 我不知道如何将结果传递给启动的线程 impo
  • 将安全性集成到启用 SSL 的 Kafka 1.0

    我无法将安全性集成到启用了 ssl 的 Kafka 1 0 这是我的 server properties 的更改 security inter broker protocol SSL listeners PLAINTEXT localhos
  • 询问用户是否想要重复 python 程序

    这是我现在的代码 我需要询问用户是否想再次重复该程序 我知道你需要在这里使用 while 循环 但我被困住了 userinput eval input Enter the month as a number results userinpu
  • 如何在 MVC3 应用程序中构建 HTML 消息以进行发送?

    我在早上洗澡的时候就在想这个问题 如何在 MVC3 应用程序中构建 HTML 消息 我在想像使用PartialView并调用生成的 HTML 将其保存为字符串以在 HtmlMessage 正文中使用它 而不是做类似的事情 string bo
  • 我可以获得maven执行的测试用例总数吗?

    我有一个 Maven 项目 其中有几个子项目 每个子项目都有自己的测试用例 并且都运行良好 我想知道在父项目上执行的测试用例的数量 无论如何 我可以获得所有执行的测试用例的详细信息吗 甚至测试用例的数量也可以 请分享您的宝贵意见 如果您想一
  • 如何在FileUpload控制器中选择路径后显示图像而不点击

    最近我一直在用 ASP NET c 开发 Web 表单应用程序 我有一个图像控件
  • 如何找到潜在的非空列?

    我正在使用一个 SQL Server 数据库 该数据库的约束非常少 并且想要应用一些非空约束 有没有办法扫描数据库中所有可为空的列并选择哪些列不包含任何空值 甚至更好地计算空值的数量 也许用一点动态 SQL Example Declare
  • GPU - 系统内存映射

    如何映射系统内存 RAM 以供 GPU 访问 我很清楚虚拟内存如何为 cpu 工作 但不确定当 GPU 访问 GPU 映射的系统内存 主机 时 虚拟内存如何工作 基本上与数据如何从系统内存复制到主机内存以及反之亦然有关 您能提供有参考文章支