问题标签 [multi-gpu]

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 投票
2 回答
150 浏览

cuda - 在两个 GPU 上运行的代码无法达到并发执行,并且没有相关的加速

我有这样的代码:

上述循环中的每次迭代都是独立的。我想同时运行它们。所以,我尝试了这个:

我正在使用 2 GTX 680,我想同时使用这两个设备。使用上面的代码,我没有得到任何加速。处理时间几乎与在单个 GPU 上运行时相同。

如何在两个可用设备上实现并发执行?

0 投票
2 回答
1882 浏览

cuda - 同时使用 2 个 GPU 调用 cudaMalloc 时性能不佳

我有一个应用程序,我在用户系统上的 GPU 之间分配处理负载。基本上,每个 GPU 都有一个 CPU 线程,当主应用程序线程定期触发时 ,它会启动一个GPU 处理间隔。

考虑下图(使用 NVIDIA 的 CUDA 分析器工具生成)作为GPU 处理间隔的示例——这里的应用程序使用单个 GPU。

在此处输入图像描述

正如您所看到的,GPU 处理时间的很大一部分被两个排序操作所消耗,我为此使用了 Thrust 库(thrust::sort_by_key)。此外,在开始实际排序之前,thrust::sort_by_key 似乎在后台调用了一些 cudaMalloc。

现在考虑应用程序将处理负载分散到两个 GPU 上的相同处理间隔:

在此处输入图像描述

在一个完美的世界中,您会期望 2 个 GPU 的处理间隔恰好是单个 GPU 的一半(因为每个 GPU 都在做一半的工作)。正如您所看到的,情况并非如此,部分原因是由于某种争用问题,当同时调用 cudaMallocs 时它们似乎需要更长的时间(有时长 2-3 倍)。我不明白为什么会这样,因为 2 个 GPU 的内存分配空间是完全独立的,因此 cudaMalloc 上不应该有系统范围的锁定——每个 GPU 的锁定会更合理。

为了证明我的假设问题在于同时调用 cudaMalloc,我创建了一个非常简单的程序,其中有两个 CPU 线程(每个 GPU),每个线程调用 cudaMalloc 多次。我首先运行了这个程序,以便单独的线程不会同时调用 cudaMalloc:

在此处输入图像描述

您会看到每次分配大约需要 175 微秒。接下来,我使用同时调用 cudaMalloc 的线程运行程序:

在此处输入图像描述

在这里,每个调用花费了大约 538 微秒,或者是前一个案例的 3 倍!不用说,这极大地降低了我的应用程序的速度,并且理所当然地,这个问题只会在超过 2 个 GPU 时变得更糟。

我在 Linux 和 Windows 上注意到了这种行为。在 Linux 上,我使用的是 Nvidia 驱动程序版本 319.60,在 Windows 上我使用的是 327.23 版本。我正在使用 CUDA 工具包 5.5。

可能的原因: 我在这些测试中使用的是 GTX 690。这张卡基本上是 2 680 类似的 GPU 安装在同一个单元中。这是我运行的唯一“多 GPU”设置,所以 cudaMalloc 问题可能与 690 的 2 个 GPU 之间的某些硬件依赖有关?

0 投票
1 回答
1836 浏览

linux - 使用 Nvidia GTX 590 的多 GPU GPUDirect 点对点通信问题

我有一个带有 2 个 GTX 590 卡(4 个 GPU)的 linux 盒子。使用 CUDA 4.0 驱动程序,我能够调用 GPUDirect 内存访问并验证我的 4 个 GPU 的所有可能对之间的成功复制。

但是,在我升级到 CUDA 4.1 驱动程序(或任何后续驱动程序)后,我在 GPUDirect 访问对中受到限制。

例如,在 CUDA 4.0 下,以下之间启用了点对点:

GPU0 <-> GPU1

GPU0 <-> GPU2

GPU0 <-> GPU3

GPU1 <-> GPU2

GPU1 <-> GPU3

GPU2 <-> GPU3

但在 CUDA 4.1(或更高版本)下,我仅限于访问:

GPU0 <-> GPU1(同一张卡)

GPU2 <-> GPU3(同一张卡)

GPU1 <-> GPU3

在使用最新的 CUDA 5.x 驱动程序时,任何人都可以解释这一点或知道解决方法吗?


$ lspci -tv (有趣的部分)给出:

在我看来,所有路径在物理上都是可用的(树状结构),它们在使用 cuda 4.0 时是可用的,但在使用 cuda 4.1 及更高版本时,cudaDeviceCanAccessPeer() 会为“跨卡”通信提供错误。请注意,所有主机到设备的路径始终可用(当然)。

0 投票
1 回答
439 浏览

cuda - 我可以通过 Infiniband 加载/存储访问从不同 PCIe 总线中的 GPU2-Core 到 GPU1-RAM 在 RDMA 中使用吗?

如此处所述:https ://developer.nvidia.com/gpudirect 我可以在同一 PCIe 总线上从 GPU0-Core 访问 GPU1-RAM:

  • 加载/存储
  • cudaMemcpy()

它被命名为“NVIDIA GPUDirect v2 Peer-to-Peer (P2P) Communication between GPUs on the Same PCIe Bus (2011)”: 在此处输入图像描述

我可以通过 Infiniband 使用 RDMA 在不同的 PCIe 总线上从 GPU2-RAM 复制到 GPU1-RAM,它被命名为“GPUDirect™ Support for RDMA, Introduced with CUDA 5 (2012)”: 在此处输入图像描述

但是我可以在通过 Infiniband 连接的不同 PCIe 总线上的 RDMA 中使用:

  • 加载/存储(从 GPU2-Core 访问 GPU-RAM)
  • cudaMemcpy()(从 GPU2-RAM 复制到 GPU1-RAM)

还是只能cudaMemcpy()在 RDMA 中使用?

0 投票
2 回答
258 浏览

c - OpenCL 多 GPU 缓冲区读取失败

我正在尝试让 2 个 Nvidia GPU 并排工作以进行 n 体模拟(来源)。我进行了适当的检测,并将所有 OpenCL 内容存储在一个结构中:

所以现在,每个设备都分配了自己的结构(它自己的上下文、队列等),并且每一步我都运行这 2 个函数:

一步看起来像这样:

每个设备都有一个要解决的问题子集。

我有一个问题,前 64 个(有时是 128 个)从一个或另一个 GPU 浮动,我尝试复制回 CPU 实际上不会复制。否则,一切正常,第一个 GPU 完美运行。有时它只是工作,但只是随机出现错误并且它不会消失。有什么建议么?

0 投票
1 回答
230 浏览

cuda - 多 GPU 点对点

我在为点对点通信设置 2 个 GPU 时遇到了一些困难。我正在使用 Cuda 4.0 并使用 fortran 进行编程。PGI 编译器

我编写了一个程序,确认我的节点上有 4 个 GPU 可用。

我决定使用其中两个,但出现以下错误: 0: DEALLOCATE: invalid device pointer

有了以下我没有错误:

有了这个,也没有错误:

但是这个返回错误

所以看来我无法设置 2GPU 来启动我的程序。你能帮我理解为什么不能设置 2GPU 并提示解决这个问题吗?

0 投票
1 回答
356 浏览

cuda - cudaMemcpy 和 cublas 是否在点对点模式下阻塞?

我想通过调用在两个 CUDA 设备(支持 UVA)之间复制内存cudaMemcpy。我想知道调用是否与主机同步?我知道cudaMemcpy在同一设备内是异步的,但是不同设备之间的副本呢?我是否需要打电话cudaDeviceSynchronize以确保复制已完成或自动确保复制?

我也有关于cublas的类似问题。我想将存储在一个设备上的向量添加到存储在另一个设备上的向量中,所以我呼吁cublasSaxpy这样做。它会阻塞主机直到操作完成,还是我需要显式同步?

0 投票
1 回答
1130 浏览

cuda - 多 GPU 与 GPU 集群

我正在使用 cuda 编程来进行有效和快速的计算。在研究过程中,我发现多 GPU 和 GPU 集群是进一步有效计算的另一种方法,但我对这两个术语感到困惑。

就编程 cuda 而言,这两者之间的实际区别是什么?

0 投票
5 回答
112469 浏览

java - Using Java with Nvidia GPUs (CUDA)

I'm working on a business project that is done in Java, and it needs huge computation power to compute business markets. Simple math, but with huge amount of data.

We ordered some CUDA GPUs to try it with and since Java is not supported by CUDA, I'm wondering where to start. Should I build a JNI interface? Should I use JCUDA or are there other ways?

I don’t have experience in this field and I would like if someone could direct me to something so I can start researching and learning.

0 投票
1 回答
42 浏览

sorting - MultiGPU中的原子交换排序算法

原子交换排序算法如何在 MultiGPU 中实现?有参考资料吗??