问题标签 [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 投票
1 回答
758 浏览

optimization - 如何减轻 CUDA 很长的初始化延迟?

在当今的许多服务器级机器上,在新创建的进程中初始化 CUDA 可能需要半秒或更长的时间。正如@RobertCrovella解释的那样,CUDA 初始化通常包括建立统一内存模型,这涉及设备和主机内存映射的协调。对于具有大量内存的机器,这可能需要相当长的时间;并且可能还有其他因素导致这种长时间的延迟。

当您想要运行一系列使用 CUDA 的进程时,这种效果会变得非常烦人,这些进程不使用复杂的虚拟内存映射:它们每个都必须等待他们漫长的等待——尽管事实上“基本上”,它们可以重新-使用 CUDA 是否上次进行的初始化(可能使用一些清理代码)。

现在,显然,如果您以某种方式重写所有这些进程的代码以在单个进程中执行 - 这将为您节省那些漫长的初始化成本。但是没有更简单的方法吗?关于什么:

  • 在进程之间传递相同的状态信息/CUDA 上下文?
  • 告诉 CUDA 完全忽略大多数主机内存?
  • 让统一内存协调比现在更懒惰,以便它只在实际需要的情况下发生?
  • 在禁用统一内存的情况下启动 CUDA?
  • 保留一些守护进程并锁定它已经初始化的 CUDA 状态?
0 投票
1 回答
2430 浏览

memory - 统一内存与固定主机内存的行为和性能

我是一名学生,目前正在从事一个项目,该项目包括在 CUDA 中编写某个程序。我相信这个程序的主题与问题无关;但我不得不提一下,我的教授在看到我尝试创建 CUDA 智能指针类后建议我在程序中使用统一内存。最好将此类描述为满足 RAII 习惯用法的“指向数组的唯一指针”。

在查看了关于统一内存的 CUDA 6.0 发行说明(以及 CUDA 8.0 中引入的更新)之后,我非常怀疑是否应该切换到统一内存。

Q1:我知道CUDA统一内存是映射GPU和CPU内存。但是我们在谈论什么样的 CPU 内存呢?固定内存是否允许更快的数据传输?还是标准的分页系统内存?

Q2:我知道其中引入的更新CUDA 8.0主要是关于 Pascal 架构的。但是我可以期待 Maxwell 架构的加速(相对于主机固定内存)吗?

Q3:虽然我只是一个学生,但我可以看到英伟达在开发统一内存方面投入了大量的工作。因此,从长远来看,人们可能会认为使用统一内存是一个更好的主意。我对吗?

Q4:是否每次我想访问主机上数组的单个元素(而数据驻留在设备上)时,整个数组都会被复制到主机上?

0 投票
1 回答
98 浏览

cuda - 创建统一内存时是否需要提供 Gpu 上下文?

问题1)

当我调用 CUDA 驱动 API 时,通常我需要先将上下文(代表 GPU 运行时)推送到当前线程。对于 normal cuMalloc,内存将分配在上下文指定的 GPU 上。但是如果我尝试调用cuMallocManaged创建统一内存,是否还需要推送 GPU 上下文?

问题2)

假设我有 2 个 GPU,每个都有 1 GB DRAM。那么我可以分配2 GB的统一内存吗?每个 GPU 拥有一半吗?

0 投票
1 回答
1151 浏览

cuda - 我们可以将“普通”GPU 内存复制到“统一”内存吗?

我们有两个 GPU 内存,一个分配cuMalloc为普通设备内存,另一个分配cuMallocManaged为统一内存。可以在它们之间复制吗?如果我们使用驱动API,我应该使用什么方向?

0 投票
1 回答
1608 浏览

cuda - GPU 内存超额使用映射内存、统一虚拟寻址和统一内存

我正在考虑在 GPU 上处理数据的可能性,这对于 GPU 内存来说太大了,我有几个问题。

如果我理解正确,使用映射内存,数据驻留在主内存中,并且仅在访问时才传输到 GPU,因此分配超过 GPU 内存的内存应该不是问题。

UVA 类似于映射内存,但数据既可以存储在 CPU 内存中,也可以存储在 GPU 内存中。但是 GPU 是否有可能在充满自己的数据的同时访问主内存(与映射内存一样)?在这种情况下会发生内存溢出吗?我已经读过,使用映射内存,数据直接进入本地内存,而不是先传输到全局内存,在这种情况下不应该有任何溢出。这是真的吗?如果是的话,UVA 也是这样吗?

在 CUDA 6.0 中,UM 不允许超额订阅 GPU 内存(并且通常不允许分配比 GPU 更多的内存,即使在主内存中也是如此),但在 CUDA 8.0 中,它成为可能(https://devblogs .nvidia.com/parallelforall/beyond-gpu-memory-limits-unified-memory-pascal/)。我做对了吗?

0 投票
1 回答
1712 浏览

cuda - Cuda 统一内存与 cudaMalloc

我正在尝试做一些基准测试以确保使用 CUDA 的统一内存(UM)方法不会损害我们的性能。

我正在执行 FFT。我使用 UM 的一种方式,我使用 cudaMalloc 的一种方式

之后我比较了结果,它们都匹配(这很好)。

但是,我为 UM 方法获得的时间是 ~.5ms 与 ~.04 的 cudaMalloc 方式相比(在多次运行平均之后)

我正在使用事件记录来进行计时。我在 cufftExecC2C 调用之前和之后都有一个。

此外,我添加了另外两个事件记录来测量任何内存传输到设备之前的时间,以及在我从设备取回数据后使用数据之后的时间。

这样做时,我看到 UM 方法需要约 1.6 毫秒,而 cudaMalloc 方法需要约 0.7 毫秒。

下面是执行 UM 方法的代码片段:

以下是针对 cudaMalloc 方法的

使用统一内存方法加快速度时,我还能做些什么吗?我预计 UM 会慢一些,但不会这么慢。

我们在 Redhat 7.3 上使用 P100 和 Cuda 9

0 投票
2 回答
10786 浏览

apache-spark - Spark执行内存监控

我想要的是能够监控 Spark执行内存,而不是SparkUI 中可用的存储内存。我的意思是,执行内存不是执行内存

通过执行内存,我的意思是:

该区域用于在执行混洗、连接、排序和聚合时缓冲中间数据。这个区域的大小是通过 spark.shuffle.memoryFraction (default0.2) 配置的。根据:Spark 1.6 中的统一内存管理

经过激烈搜索答案后,我只发现未回答的 StackOverflow 问题,仅与存储内存相关的答案或使用 Ganglia类型的模糊答案的答案,使用 Cloudera 控制台等......

似乎对 Stack Overflow 上的这些信息有需求,但还没有一个令人满意的答案。以下是 StackOverflow 在搜索监控 spark 内存时的一些顶帖

监控 Spark 执行和存储内存利用率

监控 Spark 作业的内存使用情况

SPARK:如何监控 Spark 集群的内存消耗?

Spark - 监控实际使用的执行器内存

如何通过 spark 应用程序监控内存和 CPU 使用情况?

如何获取 Spark 应用程序的内存和 CPU 使用率?

问题

星火版本> 2.0

  1. 是否可以监控Spark 作业的执行内存?通过监视,我的意思是至少查看已使用/可用,就像 SparkUI 的执行器选项卡中每个执行器的存储内存一样。是还是不是?

  2. 我可以用 SparkListeners(@JacekLaskowski 吗?)历史服务器呢?还是唯一的方法是通过外部工具?Graphana,Ganglia,其他?如果是外部工具,您能否指出一个教程或提供一些更详细的指南?

  3. 我看到这个SPARK-9103 Tracking spark's memory usage似乎还不能监控执行内存。这似乎与SPARK-23206 Additional Memory Tuning Metrics相关。

  4. 是否Peak Execution memory可靠地估计任务中执行内存的使用/占用?例如,如果 Stage UI 显示一个任务在峰值时使用 1 Gb,并且每个执行程序有 5 个 cpu,这是否意味着我需要每个执行程序上至少 5 Gb 的执行内存才能完成一个阶段?

  5. 我们可以使用其他代理来了解执行内存吗?

  6. 有没有办法知道执行内存何时开始吞噬存储内存?当我的缓存表从 SparkUI 的“存储”选项卡中消失或仅保留一部分时,这是否意味着它已被执行内存驱逐?

0 投票
2 回答
793 浏览

c++ - CUDA - 统一内存(至少帕斯卡)

我想澄清一下统一内存,它是如何工作的以及如何有效地使用它。

据我所知,我们使用cudaMallocManaged(ptr, size);统一内存来分配数组。由于 Pascal 架构,可以将大小设置为大于 GPU 上可用的物理内存。

假设现在我有一个 4GB RAM、32GB RAM 用于主机和一个 1TB 文件的 GC。我想处理这个 1TB 的文件,我该如何处理?

如果我理解得很好,我可以将文件放在统一内存中,但是这个统一数组和文件之间的链接是如何进行的呢?这是否意味着我必须memcpy使用分配的指针中的整个文件cudaMallocManaged

最后,告诉我我是否正确。如果 GPU 出现未命中,CPU 将发送它存储在其 RAM 中的数据,如果不是从磁盘发送。它有点简化,但如果它像这样工作,则意味着数据需要在统一数组中。

谢谢您的帮助。

0 投票
1 回答
828 浏览

cuda - 带数组的统一内存和结构

我在 CUDA 上有一个很大的 Struct 结构数组,它是不变的,并且对于我的应用程序来说是只读的。一个非常简单的例子是

我的内核需要浏览这个图表并查询它。如您所知,将这个结构复制到 GPU 内存只是大量的代码cudaMalloccudaMemcpy统一内存应该不需要。

在我的代码中,我在 CPU 中生成了图形,然后为了测试,我设计了以下内核

被称为:

从这里进行错误检查。

当我使用testKernel如图所示时,它工作正常,但如果我将内核更改为:

我收到非法内存访问错误。

这是因为统一内存没有正确处理这类数据吗?有没有办法确保我可以避免将所有显式副本写入 GPU 内存?


完整的 MCVE:

0 投票
1 回答
279 浏览

cuda - Nvidia p100 上的 cudaMallocManaged() 问题

我正在尝试在 Nvidia P100 上编译和运行以下代码。我正在运行 CentOS 6.9、驱动程序版本 396.37 和 CUDA-9.2。这些驱动程序/ cuda 版本似乎是兼容的。

它因分段错误而失败。当我编译nvcc -g -G src/get_p100_to_work.cu并运行核心文件(cuda-gdb ./a.out core.277512)时,我得到

当我在 NVidia K40 上运行此代码时,代码运行没有错误。

问题

如何让我的代码在 P100 上运行?从本教程看来,这段代码应该运行。