问题标签 [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 回答
4458 浏览

c - 在 NUMA 机器上使用 CUDA 进行多 GPU 编程

我目前将算法移植到两个 GPU。硬件具有以下设置:

  • 两个 CPU 作为一个 NUMA 系统,因此主内存被拆分到两个 NUMA 节点。
  • 每个 GPU 都物理连接到其中一个 GPU。(每个 PCIe 控制器有一个 GPU)

我在主机上创建了两个线程来控制 GPU。每个线程都绑定到一个 NUMA 节点,即两个线程中的每一个都在一个 CPU 插槽上运行。如何确定 GPU 的数量以便我可以选择直接连接的 GPU 使用cudaSetDevice()

0 投票
1 回答
1056 浏览

windows - 如何在 windows7 上使用 DirectX 9 和多 GPU

我在 Windows 7 系统上有多个 nVidia GPU 卡(Q2000),没有 SLI,只有一个显示器。

现在我要做的是让 Direct3D9 设备在特定 GPU 上运行。

我可以使用 [Adapter] 参数IDirect3D9::CreateDevice来选择 GPU,但除非我在该 GPU 卡上连接第二台显示器,否则它将无法工作(如果我在 Windows 上只有一个桌面)。

如果我单击“分辨率控制面板”中的“检测”按钮,它可以在我的主桌面一侧制作一个“假”桌面,并且 CreateDevice(1, ...) 运行良好 - 但这不是我想要的。

对于 OpenGL,这很容易,因为 WGL_NV_gpu_affinity,它可以使 OpenGL 设备在第二个 GPU 上运行,只连接一个显示器,一个桌面在 windows 上。

我想知道是否有任何 API 可用于 Directx 9 作为“WGL_NV_gpu_affinity”工作。

任何提示将不胜感激。提前致谢!

0 投票
1 回答
408 浏览

visual-studio-2010 - VS2010 Nsight 3.0,多GPU卡但只能看到一台设备。

症状:

我首先要确保这个盒子里实际上有两张 nvidia 卡,所以

在 VS2010 -> NSight -> Windows -> SystemInfo -> 显示设备

我可以看到似乎有两个设备。

英伟达 GeForce GTX 560 Ti

英伟达 GeForce GTX 560 Ti

名称 \.\DISPLAY2
ID PCI\VEN_10DE&DEV_1200&SUBSYS_35151458&REV_A1
状态标志 无

在 VS2010 -> NSight -> Windows -> SystemInfo -> GPU 设备或 CUDA 设备

  1. 我只能看到一列值(不包括“属性”列)

  2. 我只能在 NVIDIA 控制面板 -> 3D 设置 -> 设置 PhysX 配置下看到一张卡

  3. 在代码中,当我这样做时

    整数开发计数;cudaGetDeviceCount(&devCount);

devCount 将只是 '1'

结果,我无法根据需要设置为使用特定的 GPU。

问题:

我想知道

  1. 如果这是因为显示器使用了第一张 GeForce 卡,因此所有 CUDA 计算都在第二张卡上进行,并且只知道第二张卡?

  2. 即使假设是正确的,有没有办法在 Windows 上规避这个问题,以便我仍然可以在两个 GPU 设备上进行计算?

0 投票
1 回答
357 浏览

cuda - CUDA多GPU添加功能

我按照下面的例子: multi-GPU basic usage

该代码正在总结:

回答为已接受的人发送添加函数,如下所示:

在上面的代码中,他NS[dev]还添加了添加功能,但是发送问题帖子的人添加了如下功能:

上述函数的作用是什么 Ns[dev]。因为当我 Ns[dev]在下面的代码中删除时,像这样:

添加功能不起作用。我的意思是它不会增加值。

我如何 Ns[dev]在这里使用添加功能?

0 投票
1 回答
547 浏览

opengl - 两张 GPU 卡,一张 Endabled Display,一张 Disabled Display:如何判断 OpenGL 在哪个 GPU 卡上运行?

所以我有两张 NVidia GPU 卡

卡 A:GeForce GTX 560 Ti - 有线连接到显示器 A (Dell P2210)

卡 B:GeForce 9800 GTX+ - 有线连接到显示器 B (ViewSonic VP20)

设置:带有支持 SLI 的 Intel Core i7 的华硕主板

在 NVidia 控制面板中,我禁用了监视器 A,因此我只有监视器 B 用于所有显示目的。

在此处输入图像描述

我运行了我的程序,它

  • 在 OpenGL 中模拟 10000 个粒子并渲染它们(在监视器 B 中正确显示)

  • 使用 cudaSetDevice() 在卡 A 上“定位”以运行计算密集型 CUDA 内核。

这个想法很简单——使用卡 B 进行所有 OpenGL 渲染工作,使用卡 A 进行所有 CUDA 内核计算工作。

我的问题是这样的:

使用 GPU-Z 监控两张卡后,我可以看到:

  • 卡 A 的 GPU 负载按预期立即增加到 60% 以上。

  • 然而,卡 B 的 GPU 负载仅增加了 2%。对于在 opengl 中以 3D 渲染的 10000 个粒子,我不确定这是否是我应该预料到的。

那么我如何才能确定 OpenGL 渲染是否确实使用了卡 B(其连接的监视器 B 是唯一启用的监视器),并且与卡 A 无关?

问题的扩展是:

  • 有没有办法“强制”OpenGL 渲染逻辑使用特定的 GPU 卡?
0 投票
1 回答
223 浏览

cuda - 当分配的内存增加时,多 GPU 性能会下降

我在 Windows 7 x64、Visual C++ 10 的 GTX 690 GPU 和 4GB RAM 上测试了以下内容:

我编写了一个函数,它接收 2 个向量并添加到第 3 个向量中。该任务在 2 个 GPU 设备上被打破。我逐渐增加了向量大小来测试 GPU 性能。所需时间相对于向量大小线性增加,直到某个点,然后突然向上跳跃。当我禁用每个 GPU 内核时,所需时间与可用内存结束保持线性关系。我附上了一张图表,显示了所需时间与分配的内存。

您可以在此处查看速度图:速度比较图!

你能告诉我有什么问题吗?

最好的,拉敏

这是我的代码:

0 投票
1 回答
146 浏览

cuda - 多 GPU 内存分配的行为因分配顺序不同而不同

我已经在 Windows 7 x64、Visual C++ 10 和 4 GB RAM 的 GTX 690 GPU 上对此进行了测试:

我想在两台设备上分别分配 1.2 GB RAM。如果我从第一个设备然后第二个设备获取 ram,它会失败并返回内存分配错误,但是当我首先从设备 1 和设备 0 获取它时,它没有问题。谁能告诉我为什么?

此代码失败:

此代码有效:

最好的,拉敏

PS CudaCheck 函数只检查输出结果。

0 投票
1 回答
729 浏览

c++ - 在多个 Nvidia GPU 上使用以下代码进行分段错误

当配置为在多个卡上运行(我有一个 4 GPU 系统(NVIDIA Titan's))时,以下代码在一段时间后可靠地导致分段错误。这是我之前尝试解决的问题的一个最小示例(请参见此处:从 libcuda.so.1 调用的 __pthread_getspecific 中的分段错误)。

代码作用的描述:

首先,它在每张卡上分配大量内存(在前 N 张卡上,其中 N 为 1-4),其想法是尽可能给卡施加压力。然后它继续启动 16 个线程,每个线程在一张随机卡上运行几个内核。它会重复几次,每次随机选择一张卡片,然后退出。主线程等待所有 16 个线程完成,然后无限期地重复该过程,或者直到其中一个线程由于某种原因失败。

在主线程的几次(通常大约 20 次,但可能或多或少)迭代之后,它会导致分段错误。堆栈通常如下所示:

完整的源代码:

主.cpp:

cuda_test.cu:

生成文件:

我正在使用带有最新驱动程序(319.32)的 CUDA 5.5,运行 Ubuntu Linux(64 位)。

我的问题是: 代码中是否存在可能导致这种行为的错误?为什么我只使用一张卡时没有看到崩溃?只是坠机的可能性要小得多吗?(似乎使用更多卡会使崩溃比使用更少卡更快地出现) 奖励:是否有其他人使用此代码看到崩溃?

0 投票
1 回答
290 浏览

matlab - 在 GPU 上存储数据并在 MATLAB 中并行化卷积

我有一个严重依赖卷积的代码。它负责 80% 以上的时间运行时间。我想使用 gpu 让它更快,但有些事情我不完全理解,(我还没有权限为我自己测试这个)

  1. 如果我在类的构造函数(从句柄继承)中传递信息以存储在 GPU 内存中(使用gpuArray),它会保留在那里吗?将类作为参数传递给函数会有问题吗?对数据本身执行的操作都可以在 GPU 上完成(我猜无论数组存储在哪里,数组上的循环都可以正常工作)

  2. 我有一个矩阵size(MyMat)=[s, s, b, n],我想在其中存储 n 个[s, s, b]同时计算的大小不同的矩阵(可以在 GPU 上完成的操作)我必须使用 parfor 吗?(我知道在大多数情况下开销使它成为一个坏主意)还是有更快的方法让 GPU 快速完成这项工作?在这种情况下我需要执行的唯一计算是卷积(但它不能全部在单个 convn 操作中完成)

谢谢!

0 投票
2 回答
3082 浏览

opengl - OpenCL/OpenGL 与多个 GPU 的互操作

我在使用具有 OpenCL/OpenGL 互操作性的多个 GPU 时遇到问题。我正在尝试编写一个呈现密集计算结果的应用程序。最后它会运行一个优化问题,然后根据结果在屏幕上渲染一些东西。作为测试用例,我从本课程的粒子模拟示例代码开始:http ://web.engr.oregonstate.edu/~mjb/sig13/

示例代码创建 OpenGL 上下文,然后使用 cl_khr_gl_sharing 扩展创建共享状态的 OpenCL 上下文。当我使用单个 GPU 时,一切正常。创建上下文如下所示:

稍后,该示例使用 clCreateFromGLBuffer 创建共享 CL/GL 缓冲区。

现在,我想从两个 GPU 设备创建一个上下文:

我已经成功打开了这些设备,并且可以查询它们是否都支持 cl_khr_gl_sharing,并且都可以单独工作。但是,当尝试创建上述上下文时,我得到

这是 cl_khr_gl_sharing 扩展添加的错误代码。在扩展描述(上面链接)它说

  • CL_INVALID_OPERATION 如果为 CGL、EGL、GLX 或 WGL 之一指定了上下文或共享组对象,并且满足以下任何条件:

    • OpenGL 实现不支持为其指定了上下文或共享组对象的窗口系统绑定 API。
    • 多个属性 CL_CGL_SHAREGROUP_KHR、CL_EGL_DISPLAY_KHR、CL_GLX_DISPLAY_KHR 和 CL_WGL_HDC_KHR 设置为非默认值。
    • 属性 CL_CGL_SHAREGROUP_KHR 和 CL_GL_CONTEXT_KHR 都设置为非默认值。
    • 参数中指定的任何设备都不能支持共享 OpenGL 对象数据存储的 OpenCL 对象,如第 9.12 节所述。”

该描述似乎不完全适合我的任何情况。不能与多个 GPU 进行 OpenCL/OpenGL 互操作吗?还是我有异构硬件?我从枚举的设备中打印出一些参数。我刚刚使用了两个随机的 GPU,我可以拿到手。

请注意,如果我创建没有互操作部分的上下文(例如 props 数组如下所示),那么它会成功创建上下文,但显然不能与应用程序的 OpenGL 端共享缓冲区。