问题标签 [unified-memory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
26 浏览

gpu - 使用 GPU 的统一内存(UM 或 SVA)模式的真实场景是什么?

在 NV GPU 中,UM 模式意味着当您将数据放入“托管内存”时,GPU 和 CPU 可以使用相同的虚拟地址指针访问主机内存中的数据。这实际上是通过 CPU 和 GPU 之间的页面复制来完成的,但效果是 CPU 和 GPU 正在使用相同的 VA 指针访问同一条数据。这很方便,但问题是在 UM 模式下性能要低得多,因为需要大量时间来进行页面复制和管理(禁用或启用 CPU 和 GPU 上的页表)。

所以我的问题是:谁真正在实际应用中使用带有 GPU 的 UM 模式?典型的使用场景是什么?

0 投票
1 回答
68 浏览

cuda - 当 CPU 尝试读取由 GPU 初始化的托管内存时,为什么数据会从主机迁移到设备?

在下面的测试代码中,我们通过 GPU 初始化数据,然后通过 CPU 访问数据。我对 nvprof 的分析结果有 2 个问题。

  • 为什么会有一个数据从主机迁移到设备?据我了解,它应该是设备到主机。

  • 为什么 H->D 计数为 2?我认为它应该是 1,因为数据在一页中。

提前致谢!

我的环境

  • 驱动程序版本:418.87.00
  • CUDA 版本:10.1
  • Ubuntu 18.04
0 投票
1 回答
73 浏览

c++ - 从 cuda 设备上的统一内存打印阵列不起作用

我尝试在 cuda 设备上创建一些哈希并将它们打印在主机上。但是在主机上的 printf 上,我在位置 0x000000000100002F 处出现读取错误

相关行如下所示:

在设备上

回到主机端...

似乎是正确的,但是当我尝试在主机上打印散列时,我得到一个读取错误?

0 投票
1 回答
144 浏览

deep-copy - OpenACC:深度复制和统一内存

我想清楚地了解我经常遇到的使用 OpenACC 加速应用程序的情况。假设我有这个循环:

作为数据结构化类型变量:

我注意到无论是否使用统一内存(-ta=tesla:managed),执行时都会出现错误:error 700: Illegal address during kernel execution. 我发现了我在文献中读到的深拷贝问题的问题:编译器完成的隐式拷贝对 A 做了一个简单的拷贝,它指向主机内存上的一个地址,但不是它所指向的数据的拷贝。设备无法读取主机地址,这会产生错误。

  1. 深拷贝问题是对我的错误的正确解释吗?

  2. 此外,如果我正在使用统一内存并且它确实是一个深拷贝问题,那么设备是否应该能够读取地址,至少虚拟地位于统一内存和地址空间上的 A?

我可以轻松解决添加指令的错误:

并添加present(data)到并行编译指示。请注意,我不需要手动复制 A 和 B。

我想了解问题的原因和解决方案。

0 投票
1 回答
247 浏览

cuda - 带有 cuBLAS 的 cudaMallocManaged(统一内存)

我正在尝试将统一内存与 cudaMallocManaged() 与 cuBLAS 库一起使用。我正在执行一个简单的矩阵到向量乘法作为一个简单的例子,并将结果存储在一个数组results中。但是,在打印results数组时,我得到了所有的 0,而不是矩阵乘以mat向量的结果vec
我正在使用的流程是:

  1. 使用 cudaMallocManaged() 分配内存
  2. 用数据初始化数组
  3. 分配 cuBLAS 句柄
  4. 调用 cublasDgemv 执行将结果存储在results

当使用new然后cublasSetMatrix()cublasSetVector()这工作正常。

如何在 cuBLAS 中使用统一内存?

以下是最低限度的工作示例:

统一内存尝试(这会返回所有的 0 results):

常规 malloc/setMatrix() 尝试:

使用
nvcc -o main main.cu -lcublas 编译

0 投票
1 回答
127 浏览

cuda - 使用统一内存时 CUDA 中出现意外的读取访问冲突错误

我有一个对象说它d_obj在统一内存上有一些成员,而在设备内存上有一些成员。然后我调用一个 CUDA 内核来获取对象并使用它。我想在内核调用后立即让 CPU 对统一内存上的成员做一些事情,但这失败了。在这里,我使用简短的代码重现了我的问题:

是否不能同时从主机和设备访问统一内存上的某些内容?我想知道这个问题是否有任何解决方法?

操作系统:Windows 10/CUDA 11.2/设备:GeForce RTX 3090

0 投票
1 回答
77 浏览

c++ - CUDA 循环中的空间局部性

我正在阅读 Even Easier Introduction to CUDA,我正在考虑这样的例子:

其中每个线程跨过数组。在正常的 CPU 计算中,人们宁愿将数组拆分为连续的子数组,这些子数组在线程之间进行拆分,以便它们可以更好地利用空间局部性。

这个概念是否也适用于 CUDA 的统一内存?我想了解在这种情况下最有效的方法是什么。

0 投票
3 回答
169 浏览

c++ - 克服 CUDA 中的复制开销

我想使用 CUDA 在 GPU 上并行化图像操作,对图像的每个像素(或像素组)使用一个线程。操作非常简单:每个像素乘以一个值。

但是,如果我理解正确,为了将图像放在 GPU 上并对其进行并行处理,我必须将其复制到统一内存或其他一些 GPU 可访问的内存,这基本上是一个双循环,就像一个这将在 CPU 上处理图像。我想知道是否有一种更有效的方法可以在 GPU 上复制图像(即 1D 或 2D 数组)而没有开销,从而导致并行化毫无用处。

0 投票
1 回答
91 浏览

cuda - CUDA 统一内存页面在 CPU 中访问但未从 GPU 中逐出

我试图了解 CUDA 统一内存的功能。我已经阅读了针对初学者的关于 CUDA 统一内存的博客。我写了下面给出的代码:

输出:

我在提供 16 GB Tesla P100 PCIe GPU 的 Kaggle 上运行代码。x我有一个使用分配的整数数组cudaMallocManaged()。首先,我在 GPU 中预取数组并对其进行一些处理,然后将其预取到 CPU 并进行一些处理。在这两者之间,我打印了内存传输前后 GPU 上可用的空闲内存。基于此,我有两个问题:

  1. 在空闲内存减少后cudaMallocManaged()的第一次预取期间,比我分配的要多得多。为什么?

  2. 预取到 CPU 前后的空闲内存是一样的。此外,当我访问和修改 CPU 上的数组时,GPU 上的可用内存在此之前和之后仍然保持不变。我不明白为什么会这样。在预取/处理 CPU 上的统一内存位置时,GPU 上的相应页面不应该被驱逐并移动到 CPU,这不应该释放 GPU 内存吗?

0 投票
1 回答
160 浏览

c++ - Cuda统一内存:当使用指针或非指针对象作为类成员时,程序得到不同的结果

最近,我学习了如何使用 cuda 统一内存进行编码。但是奇怪的是,当我用非指针对象替换指针对象时,内核会报告不同的结果。

请参考Core.cuh 和main.cu。

ClassManaged.h 是新建和删除重载的基类,CMakeList.txt 是构建测试用例的基类。

内核在非指针或指针之间打印类 Core 的不同信息,请参见 printf 代码块。

平台信息:

操作系统:赢 10

Cuda:11.1.74 附带 RTX 2060

赢 SDK 10.0.18362.0

MSVC 19.28.29334.0

视觉工作室 16 2019

简而言之,main.cu 的 test1 中的错误输出似乎来自Core 类:public Managed(重载统一内存新建和删除)。

新修改的代码在cudaMallocManaged和内核阶段打印Core所有成员的地址。

很明显,在BUG版本中,调用内核时box的地址是不同的(比如box地址从0跳转到4)。

在正确的版本中没有这样的东西。可以推断出盒子地址是从某处流向某处的吗?

这是否意味着内存超出范围或泄漏?(我猜但不确定)。

已解决------------->!!!!

感谢罗伯特,我找到了这个错误的原因。请参阅NVIDIA 文档

CUDA 编译器遵循 IA64 ABI 进行类布局,而 Microsoft 主机编译器则不遵循。令 T 表示指向成员类型的指针,或满足以下任一条件的类类型:

T 具有虚函数。

T 有一个虚拟基类。

T 具有多个继承,具有多个直接或间接空基类。

T 的所有直接和间接基类 B 都是空的,并且 T 的第一个字段 F 的类型在其定义中使用 B,因此 B 在 F 的定义中位于偏移量 0 处。

由于 box 和 Core 都是 Managed 的​​子类,如果我们把 box 放在第一个顺序,代码匹配第四个 case,<em>T 的所有直接和间接基类 B 都是空的...

与 x64 ABI(Win 主机)相比,由于 cuda 的 IA64 ABI,Win OS 上可能会出现未定义的行为。

我非常感谢您的建议!非常感谢你!