CUDA 零复制内存注意事项

2023-11-24

我试图弄清楚使用 cudaHostAlloc (或 cudaMallocHost?) 是否合适。

我正在尝试运行一个内核,其中我的输入数据超过 GPU 上的可用数据量。

我的 cudaMallocHost 空间可以大于 GPU 上的空间吗?如果没有,假设我分配了我需要的 1/4 空间(适合 GPU),那么使用固定内存有什么优势吗?

我本质上仍然必须从 1/4 大小的缓冲区复制到我的全尺寸 malloc'd 缓冲区中,这可能不会比仅使用正常的 cudaMalloc 更快,对吧?

对于使用 cudaMallocHost,以下典型使用场景是否正确:

  1. 分配固定主机内存(我们称之为“h_p”)
  2. 用输入数据填充 h_p -
  3. 获取 GPU 上 h_p 的设备指针
  4. 使用该设备指针运行内核来修改数组的内容-
  5. 像平常一样使用 h_p,现在已经修改了内容 -

那么 - 在第 4 步和第 5 步之间没有副本必须满意,对吧?

如果这是正确的,那么我可以看到至少一次适合 GPU 的内核的优势


内存传输是影响 CUDA 应用程序性能的一个重要因素。cudaMallocHost可以做两件事:

  • 分配固定内存:这是 CUDA 运行时可以跟踪的页锁定主机内存。如果以这种方式分配的主机内存涉及cudaMemcpy作为源或目标,CUDA 运行时将能够执行优化的内存传输。
  • 分配映射内存:这也是页锁定内存,可以直接在内核代码中使用,因为它映射到 CUDA 地址空间。为此,您必须设置cudaDeviceMapHost标志使用cudaSetDeviceFlags在使用任何其他 CUDA 函数之前。 GPU内存大小不限制映射的主机内存的大小。

我不确定后一种技术的性能。它可以让你很好地重叠计算和通信。

如果您访问内核中的块内存(即您不需要整个数据,而只需要一部分),您可以使用利用异步内存传输的多缓冲方法cudaMemcpyAsync通过在 GPU 上拥有多个缓冲区:在一个缓冲区上进行计算,将一个缓冲区传输到主机,同时将一个缓冲区传输到设备。

使用时我相信您关于使用场景的断言是正确的cudaDeviceMapHost分配类型。您不必执行显式副本,但肯定会有您看不到的隐式副本。它有可能与您的计算很好地重叠。请注意,您可能需要同步内核调用以确保内核完成并且您在 h_p 中拥有修改后的内容。

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

CUDA 零复制内存注意事项 的相关文章

随机推荐

  • Meteor.js 可以使用 Cassandra 而不是 MongoDB 吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在启动一个创建客户支持系统的项目 对于这个系统我看过Meteor js 看起来很有趣 问题是我们想使用构建系统的其余部分卡桑德拉 所以我的问题如下 meteor js 也可以与
  • Spring Boot 1.5.2 - Web 应用程序在加载徽标后停止?

    我在使用 Spring Boot 时遇到了一个非常奇怪的问题 我不知道为什么使用 Spring Boot 的 Web 应用程序无法启动 并且即使我直接在终端上运行它也没有输出错误 java jar var lib tomcat webapp
  • 读取带有动态键字段的表?

    我有一张桌子的名字DATA lv tablename TYPE tabname VALUE xxxxx 和一个通用的FIELD SYMBOLS
  • 激活资源过滤后编码错误

    我正在开发一个基于 Maven 的网络项目 在我的网络模块中 我使用不同语言的特定资源包 德语 西班牙 我的所有源代码均基于 UTF 8 一切正常 现在需要根据不同的maven配置文件激活maven资源过滤来替换一些配置 我的 pom xm
  • 通过表达式在变量中设置 SSIS 包中昨天的日期

    我正在设置一个变量SSIS包 我正在使用这个表达式 DATEPART yyyy GETDATE 10000 DATEPART month GETDATE 100 DATEPART day GETDATE 该表达式将为我提供一个变量值 例如
  • 如何将 String 转换为 BeautifulSoup 对象?

    我正在尝试抓取新闻网站 并且需要更改一个参数 我将其更改为替换为下一个代码 while i lt len links conn urllib urlopen links i html conn read soup BeautifulSoup
  • read.csv 警告“带引号的字符串内的 EOF”阻止完整读取文件

    I have CSV 文件 24 1 MB 我无法完全读懂我的 R 会话 当我在电子表格程序中打开该文件时 我可以看到 112 544 行 当我将其读入 R 时read csv我只收到 56 952 行和此警告 cit lt read cs
  • 如何在 OpenCV 中读取 Adob​​e RGB 色彩空间的 jpeg 图像?

    我正在尝试在 OpenCV 中使用 Adob e RGB 色彩空间读取和写入 jpeg OpenCV 假定 jpeg 具有 sRGB 色彩空间 并且在显示或写入文件时 图像会丢失一些颜色强度 我发现这种强度损失是由于我的答案的色彩空间差异造
  • 如何在 auto_increment 列中找到“漏洞”?

    例如 当我删除 id 3 时 我有以下内容 id name 1 2 4 5 现在 我想搜索丢失的 id 因为我想再次填充 id INSERT INTO xx id VALUES 3 有没有办法在 auto increment 索引中搜索 漏
  • 在 Visual Studio 2015 中调试本机 Android 库时断点不起作用

    在全新安装的 Visual Studio 2015 上 我创建了一个 Android 应用程序和 Android 本机库 本机库中的函数通过 DllImport 指令在应用程序代码中引用 当我为主应用程序选择 Xamarin 调试器 并开始
  • 如何让我的通用比较器 (IComparer) 处理空值?

    我正在尝试编写一个用于排序的通用对象比较器 但我注意到它不能处理它所比较的 值之一为空的实例 当一个对象为空时 我希望它像空字符串一样对待它 我尝试将 null 值设置为 String Empty 但在调用 CompareTo 时出现 对象
  • 如何调试已签名发布的 APK?

    我有一个已发布的 APK 已签名 上传到 Google Play 并安装在我的 Android 设备上 我想在我的 Android 设备上运行此 APK 时对其进行调试 通过 Android Studio 或 Eclipse 我以前做过这个
  • 为什么当我将鼠标悬停在 VS Code 上时,它会出现类似芯片/扭曲的显示?

    这是我尝试使用 VS Code 时得到的视图 我已经重新安装并重新启动了系统 但没有任何进展 每当我打开 VS Code 并想要启动一个项目时 当我悬停鼠标时 情况会变得越来越糟 我最初以为我的一般显示有问题 它不会影响其他应用程序 只是
  • 我应该在构造函数中使用 getter 和 setter 吗? [复制]

    这个问题在这里已经有答案了 初始化类时 在构造函数中使用 getter 和 setter 函数是一个好习惯吗 或者直接设置变量是一个好习惯 因为构造函数可以被认为是一种变异器 您不应该从构造函数中调用 getter 和 setter 构造函
  • 带有宏的类型安全通用容器

    我正在尝试使用宏在 C 中创建类型安全的通用链表 它的工作方式应该与 C 中模板的工作方式类似 例如 LIST int list LIST CREATE int 我的第一次尝试是为了 define LIST TYPE 我上面使用的宏 定义一
  • 从“react”导入 React 会导致未捕获的语法错误:意外的标识符

    我已经安装了 webpack 3 以及 babel 和我的条目index js bundle js将构建并运行 我已经使用 ES7 8 功能对其进行了测试 但是导入不起作用并导致Uncaught SyntaxError Unexpected
  • “= =”是什么意思? [复制]

    这个问题在这里已经有答案了 我注意到有人使用 PHP 运算符 我无法理解 我用一个函数尝试过 它以疯狂的方式对应 这个运算符的定义是什么 我什至在 PHP 运算符的声明中找不到它 a b Identical TRUE if a等于 b 并且
  • Android:无法销毁活动

    我使用以下代码来删除每个视图组上的子项 protected void onDestroy super onDestroy this liberarMemoria public void liberarMemoria imagenes rec
  • 如何获取应用程序的Windows任务栏按钮以显示进度条的进度

    Windows 7 或者是 Vista 中引入的功能之一是应用程序的任务栏按钮能够显示该应用程序中进度条的进度 当我创建表单并在其上放置进度条时 它不会显示在任务栏按钮中 因此我认为这不会自动完成 如何让 Windows 7 在应用程序的任
  • CUDA 零复制内存注意事项

    我试图弄清楚使用 cudaHostAlloc 或 cudaMallocHost 是否合适 我正在尝试运行一个内核 其中我的输入数据超过 GPU 上的可用数据量 我的 cudaMallocHost 空间可以大于 GPU 上的空间吗 如果没有