问题标签 [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.
c++ - 在多 GPU 上启动异步内存复制操作
我想将主机上的一组数据分割并复制到多个 GPU 的设备内存中。另外,我想同时进行所有这些复制操作。
为此,我使用了在每个 GPU 的私有流中启动的 cudaMemcpyAsync。
这就是我正在做的事情(代码中的疑问标有以 ?? 开头的注释)
当我阅读 C 编程指南时,我看到上述内存复制操作不会异步发生,因为在两次连续的异步内存复制启动之间,我正在调用分配设备内存的主机操作(阻塞调用)。
3.2.5.5.4。隐式同步
如果主机线程在它们之间发出以下任一操作,则来自不同流的两个命令不能同时运行:
‣ 页面锁定的主机内存分配,
‣ 设备内存分配,
‣ 设备内存集,
‣ 两个地址之间的内存副本到同一设备内存,
‣ 任何 CUDA 命令到默认流,
如果上述原因似乎是真的,那么我需要拆分我的内存分配和复制操作
我上面的分析有效吗?
此外,如果不通过在每个 GPU 的默认流(流 id 0)中启动 cudaMemcpyAsync 操作来创建显式的每个 GPU 流,是否不可能做到这一点?. 我基于以下 CUDA C 编程指南中的声明:
每个设备都有自己的默认流(请参阅默认流),因此向设备的默认流发出的命令可能会乱序执行或与向任何其他设备的默认流发出的命令同时执行。
然后代码看起来像这样
cuda - 我可以通过 GPUDirect 2.0 P2P 在远程 GPU-RAM 上使用 CUDA 原子操作吗?
例如,我可以在其全局内存 (GPU-RAM) 上使用 CUDA 原子操作atomicAdd(ptr, val)
, atomicCAS(ptr, old, new)
, ...。使用 CUDA 6.5。
但是我可以通过GPUDirect 2.0 P2P将这些原子操作用于远程全局内存吗?
ubuntu - 在 64 位 Ubuntu 14.04 中使用 Nvidia *和* AMD GPU 进行 OpenCL 开发
我正在尝试让 AMD 和 NVidia GPU 在同一台 Ubuntu 14.04 PC 中运行,以便在两者上进行并行 OpenCL 开发。我使用 Ubuntu 12.04 以及此处和此处提供的信息实现了这一点。不幸的是,我当时所做的事情不再起作用(永远不要更改正在运行的系统......)。
我的问题是,是否有人实现了这一点,如果是,如何实现。关于这个问题的信息非常稀缺。问题是当我尝试同时安装两者时,两者的库和驱动程序会发生冲突 - 单独它们工作正常。从最终进入 package-dependency-hell 的包进行安装并同时使用两者的二进制驱动程序安装程序不起作用。
由于我对底层的 OpenCL 实现不太熟悉,所以我有点“不知所措”。
希望有人能指出我正确的方向。该系统是 Ubuntu 14.04、64 位,GPU 是 Geforce GTX 760 和 Radeon HD 7970。
谢谢和最好的问候!
cuda - 尝试同时使用板载 iGPU 和 Nvidia 独立卡时,CUDA 失败。我如何同时使用离散的 nvidia 和集成(板载)intel gpu?
我最近在让我的电脑(ivybridge)使用板载 gpu(intel igpu HD4000)进行正常的屏幕显示使用时遇到了一些麻烦,而我在我的机器上运行我的CUDA程序以计算我的机器上的离散 Nvidia GT 640。问题是在 iGPU 显示下,CUDA 将无法识别 nvidia 卡,并且根本无法加载 nvidia 驱动程序。
请记住,在为显示设备使用 nvidia windows 驱动程序时存在已确认的问题(主要是关于并发性),并且还希望使用 CUDA。 当您将 Intel gpu 用作显示器时(因此仅加载所述 Nvidia 驱动程序的最小部分),这些问题可能会被覆盖,并且在许多情况下,用于 linux 发行版的 nvidia 驱动程序不存在这些问题。
在使用 virtu mvp 等不良软件遇到很多麻烦之后,我发现解决方案非常简单,但无处可寻。
我把它贴在这里希望它有所帮助。请发表任何评论以使答案更完整,即使某些 pc 配置失败,因此我们可以澄清更广泛场景的说明。
multithreading - 不同的线程可以将不同的 GPU 设置为它们当前的 CUDA 设备吗?
例如,我有 2 个 GPU 和 2 个主机线程。我无法检查它,因为 multigpu PC 离我很远。我想让第一个主机线程与第一个 GPU 一起工作,第二个主机线程与第二个 GPU 一起工作。所有主机线程都由许多 cublas 调用组成。那么是否可以通过 cudaSetDevice() 调用从第一个主机线程中选择第一个 GPU,从第二个主机线程中选择第二个 GPU?
例如对于我将调用的第二个主机线程cudaSetDevice(1)
,对于我将调用的第一个线程cudaSetDevice(0)
。
c++ - 是否可以在多 GPU 机器上执行多个 CUDA 程序实例?
背景:
我编写了一个对一系列符号执行处理的 CUDA 程序。该程序并行处理所有符号序列,并规定所有序列具有相同的长度。我将我的数据分组,每组完全由相同长度的序列组成。该程序一次处理 1 个组。
问题:
我在具有 4 个 GPU 的 Linux 机器上运行我的代码,并希望通过运行我的程序的 4 个实例(每个 GPU 1 个)来利用所有 4 个 GPU。是否可以让程序选择另一个 CUDA 应用程序未使用的 GPU 来运行?当程序在具有更多或更少数量的 GPU 的不同硬件上运行时,我不想硬编码任何会导致问题的东西。
c - 在多 GPU 系统中使用 CUDA 迭代一维数组
在过去的几个月里,我一直在研究并行编程,现在我正在尝试使我的应用程序适应多 GPU 平台。问题是我仍然不太了解如何使用多个 GPU 遍历数组。
我是否需要将我的主数组划分为较小的子数组并将每个子数组发送到每个 GPU,或者有一种方法可以让每个 GPU 在数组的片段中迭代?我有这个应用程序的串行和单 GPU 版本工作,我一直在尝试使用不同的方法来解决这个问题并将其调整到多 GPU,但它们都没有返回与前两个版本相同的结果。我不知道我还能做什么,所以我的结论是我不了解如何在多 GPU 系统中迭代数组。有人能帮助我吗?
我的代码运行 N 次迭代,并且在每次迭代中,它都会遍历我的数组中的每个值(代表一个网格)并为其计算一个新值。
这是我的代码现在的样子的草图:
提前致谢。
cuda - CUDA 流设备是否与设备相关?以及如何获得流的设备?
我有一个 CUDA 流,有人交给我 - 一个cudaStream_t
值。CUDA 运行时 API似乎没有指示我如何获取与此流关联的设备的索引。
现在,我知道这cudaStream_t
只是一个指向驱动程序级流结构的指针,但我不愿过多地研究驱动程序。有没有一种惯用的方法来做到这一点?或者有什么不想做的好理由?
编辑:这个问题的另一个方面是流是否真的以某种方式与设备相关联,在这种方式下,CUDA 驱动程序本身可以在给定指向结构的情况下确定该设备的身份。
cuda - 如何在cuda中的不同gpu之间复制内存
目前我正在使用两个 gtx 650 。我的程序类似于简单的客户端/服务器结构。我将工作线程分布在两个 gpus 上。服务器线程需要从客户端线程收集结果向量,所以我需要在两个 gpu 之间复制内存。不幸的是,cuda 示例中的简单 P2P 程序无法正常工作,因为我的卡没有 TCC 驱动程序。花了两个小时在 google 和 SO 上搜索,我找不到答案。一些消息来源说我应该使用cudaMemcpyPeer
,而其他一些消息来源说我应该使用cudaMemcpy
with cudaMemcpyDefault
。除了复制到主机之外,有没有一些简单的方法可以完成我的工作复制到设备。我知道它一定已经记录在某个地方,但我找不到它。谢谢你的帮助。
gpu - 多 GPU 编程如何与 Vulkan 一起工作?
在 Vulkan 中使用多 GPU 是否类似于创建许多命令队列然后在它们之间划分命令缓冲区?
有2个问题:
- 在 OpenGL 中,我们使用 GLEW 来获取函数。对于超过 1 个 GPU,每个 GPU 都有自己的驱动程序。我们是如何使用 Vulkan 的?
- 部分帧是否由 GPU 生成,而其他帧是否由其他 GPU 生成,例如使用 Intel GPU 渲染 UI 和 AMD 或 Nvidia GPU 在 labtops 中渲染游戏屏幕?还是会在 GPU 中生成一帧,而在另一个 GPU 中生成下一帧?