问题标签 [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.
gpu - 使用 GPU 的统一内存(UM 或 SVA)模式的真实场景是什么?
在 NV GPU 中,UM 模式意味着当您将数据放入“托管内存”时,GPU 和 CPU 可以使用相同的虚拟地址指针访问主机内存中的数据。这实际上是通过 CPU 和 GPU 之间的页面复制来完成的,但效果是 CPU 和 GPU 正在使用相同的 VA 指针访问同一条数据。这很方便,但问题是在 UM 模式下性能要低得多,因为需要大量时间来进行页面复制和管理(禁用或启用 CPU 和 GPU 上的页表)。
所以我的问题是:谁真正在实际应用中使用带有 GPU 的 UM 模式?典型的使用场景是什么?
cuda - 当 CPU 尝试读取由 GPU 初始化的托管内存时,为什么数据会从主机迁移到设备?
在下面的测试代码中,我们通过 GPU 初始化数据,然后通过 CPU 访问数据。我对 nvprof 的分析结果有 2 个问题。
为什么会有一个数据从主机迁移到设备?据我了解,它应该是设备到主机。
为什么 H->D 计数为 2?我认为它应该是 1,因为数据在一页中。
提前致谢!
我的环境
- 驱动程序版本:418.87.00
- CUDA 版本:10.1
- Ubuntu 18.04
c++ - 从 cuda 设备上的统一内存打印阵列不起作用
我尝试在 cuda 设备上创建一些哈希并将它们打印在主机上。但是在主机上的 printf 上,我在位置 0x000000000100002F 处出现读取错误
相关行如下所示:
在设备上
回到主机端...
似乎是正确的,但是当我尝试在主机上打印散列时,我得到一个读取错误?
deep-copy - OpenACC:深度复制和统一内存
我想清楚地了解我经常遇到的使用 OpenACC 加速应用程序的情况。假设我有这个循环:
作为数据结构化类型变量:
我注意到无论是否使用统一内存(-ta=tesla:managed),执行时都会出现错误:error 700: Illegal address during kernel execution
. 我发现了我在文献中读到的深拷贝问题的问题:编译器完成的隐式拷贝对 A 做了一个简单的拷贝,它指向主机内存上的一个地址,但不是它所指向的数据的拷贝。设备无法读取主机地址,这会产生错误。
深拷贝问题是对我的错误的正确解释吗?
此外,如果我正在使用统一内存并且它确实是一个深拷贝问题,那么设备是否应该能够读取地址,至少虚拟地位于统一内存和地址空间上的 A?
我可以轻松解决添加指令的错误:
并添加present(data)
到并行编译指示。请注意,我不需要手动复制 A 和 B。
我想了解问题的原因和解决方案。
cuda - 带有 cuBLAS 的 cudaMallocManaged(统一内存)
我正在尝试将统一内存与 cudaMallocManaged() 与 cuBLAS 库一起使用。我正在执行一个简单的矩阵到向量乘法作为一个简单的例子,并将结果存储在一个数组results
中。但是,在打印results
数组时,我得到了所有的 0,而不是矩阵乘以mat
向量的结果vec
。
我正在使用的流程是:
- 使用 cudaMallocManaged() 分配内存
- 用数据初始化数组
- 分配 cuBLAS 句柄
- 调用 cublasDgemv 执行将结果存储在
results
当使用new
然后cublasSetMatrix()
或cublasSetVector()
这工作正常。
如何在 cuBLAS 中使用统一内存?
以下是最低限度的工作示例:
统一内存尝试(这会返回所有的 0 results
):
常规 malloc/setMatrix() 尝试:
使用
nvcc -o main main.cu -lcublas 编译
cuda - 使用统一内存时 CUDA 中出现意外的读取访问冲突错误
我有一个对象说它d_obj
在统一内存上有一些成员,而在设备内存上有一些成员。然后我调用一个 CUDA 内核来获取对象并使用它。我想在内核调用后立即让 CPU 对统一内存上的成员做一些事情,但这失败了。在这里,我使用简短的代码重现了我的问题:
是否不能同时从主机和设备访问统一内存上的某些内容?我想知道这个问题是否有任何解决方法?
操作系统:Windows 10/CUDA 11.2/设备:GeForce RTX 3090
c++ - CUDA 循环中的空间局部性
我正在阅读 Even Easier Introduction to CUDA,我正在考虑这样的例子:
其中每个线程跨过数组。在正常的 CPU 计算中,人们宁愿将数组拆分为连续的子数组,这些子数组在线程之间进行拆分,以便它们可以更好地利用空间局部性。
这个概念是否也适用于 CUDA 的统一内存?我想了解在这种情况下最有效的方法是什么。
c++ - 克服 CUDA 中的复制开销
我想使用 CUDA 在 GPU 上并行化图像操作,对图像的每个像素(或像素组)使用一个线程。操作非常简单:每个像素乘以一个值。
但是,如果我理解正确,为了将图像放在 GPU 上并对其进行并行处理,我必须将其复制到统一内存或其他一些 GPU 可访问的内存,这基本上是一个双循环,就像一个这将在 CPU 上处理图像。我想知道是否有一种更有效的方法可以在 GPU 上复制图像(即 1D 或 2D 数组)而没有开销,从而导致并行化毫无用处。
cuda - CUDA 统一内存页面在 CPU 中访问但未从 GPU 中逐出
我试图了解 CUDA 统一内存的功能。我已经阅读了针对初学者的关于 CUDA 统一内存的博客。我写了下面给出的代码:
输出:
我在提供 16 GB Tesla P100 PCIe GPU 的 Kaggle 上运行代码。x
我有一个使用分配的整数数组cudaMallocManaged()
。首先,我在 GPU 中预取数组并对其进行一些处理,然后将其预取到 CPU 并进行一些处理。在这两者之间,我打印了内存传输前后 GPU 上可用的空闲内存。基于此,我有两个问题:
在空闲内存减少后
cudaMallocManaged()
的第一次预取期间,比我分配的要多得多。为什么?预取到 CPU 前后的空闲内存是一样的。此外,当我访问和修改 CPU 上的数组时,GPU 上的可用内存在此之前和之后仍然保持不变。我不明白为什么会这样。在预取/处理 CPU 上的统一内存位置时,GPU 上的相应页面不应该被驱逐并移动到 CPU,这不应该释放 GPU 内存吗?
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 上可能会出现未定义的行为。
我非常感谢您的建议!非常感谢你!