OpenCL - 多个 GPU 缓冲区同步

2023-12-06

我有一个 OpenCL 内核,用于计算系统中其他粒子对某个粒子施加的总力,然后是另一个积分粒子位置/速度的内核。我想在多个 GPU 上并行化这些内核,基本上为每个 GPU 分配一定数量的粒子。但是,我必须多次运行该内核,并且每个 GPU 的结果都会用于其他 GPU。让我进一步解释一下:

假设 GPU 0 上有粒子 0,GPU 1 上有粒子 1。粒子 0 上的力发生了变化,粒子 1 上的力也发生了变化,然后积分器相应地改变了它们的位置和速度。然后,需要将这些新位置放置在每个 GPU 上(两个 GPU 都需要知道粒子 0 和粒子 1 的位置),并且这些新位置用于在下一步中计算每个粒子上的力,由积分器,其结果用于计算力等。本质上,在力计算进行时,所有缓冲区都需要包含相同的信息。

所以,问题是:考虑到每个 GPU 都有不同的缓冲区,跨 GPU 同步缓冲区的最佳方法是什么?如果我想保持并行性,它们就不能有一个共享缓冲区,根据我的最后一个问题(不过,如果有一种方法可以创建共享缓冲区并仍然保留多个 GPU,我完全赞成)。我怀疑每一步复制结果会导致比跨 GPU 并行算法更慢的速度。

我确实找到了这个线程,但答案并不是很明确,并且仅适用于所有 GPU 上的单个缓冲区。我特别想知道 Nvidia GPU(更具体地说,Tesla M2090)。

EDIT:事实上,按照Khronos 论坛上的这个帖子OpenCL 工作组的一位代表表示,共享上下文上的单个缓冲区确实分布在多个 GPU 上,每个 GPU 都确保其内存中具有最新信息。然而,我在 Nvidia GPU 上没有看到这种行为;当我使用watch -n .5 nvidia-smi当我的程序在后台运行时,我看到一个 GPU 的内存使用量上升了一段时间,然后下降,而另一个 GPU 的内存使用量上升。有没有人可以指出我正确的方向?也许这只是他们的实施?


听起来您在实施方面遇到了麻烦。

SIGGRAPH 有一个精彩的演示,展示了利用共享内存的多个 GPU 的几种不同方法。幻灯片是here.

我想,在您当前的设置中,您有一个包含多个设备和多个命令队列的上下文。对于您正在做的事情来说,这可能是正确的方法。

附录AOpenCL 1.2 规范说:

OpenCL 内存对象[...]是使用上下文创建的,并且可以在使用同一上下文创建的多个命令队列之间共享。

Further:

应用程序需要在主机处理器上的线程之间实现适当的同步,以确保当多个线程中的多个命令队列正在执行时,共享对象状态的更改以正确的顺序发生更改共享对象的状态。

因此,在我看来,计算粒子位置和速度的内核需要依赖于计算粒子间力的内核。听起来你已经知道了。

为了更具体地表达你的问题:

考虑到每个 GPU 都有不同的缓冲区,跨 GPU 同步缓冲区的最佳方法是什么?

...我认为答案是“不要将缓冲区分开”。使用相同的cl_mem两个设备之间的对象cl_mem对象来自相同的上下文。

至于数据实际存在的位置......正如您所指出的,这是实现定义的(至少据我从规范中可以看出)。您可能不应该担心数据所在的位置,而只需从两个命令队列访问数据即可。

我意识到这可能会造成一些严重的性能问题。实现可能会发展并变得更好,因此如果您现在根据规范编写代码,它将来可能会运行得更好。

为了获得更好(或最少不同)的缓冲区共享行为,您可以尝试的另一件事是使粒子数据成为贴图。

如果有帮助的话,我们的设置(一堆带有双 C2070 的节点)似乎相当优化地共享缓冲区。有时,数据仅保存在一台设备上,有时数据可能同时存在于两个位置。

总而言之,我认为这里的答案是按照规范提供的最佳方式进行操作,并希望在实施方面取得最佳效果。

我希望我能有所帮助,

Ryan

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCL - 多个 GPU 缓冲区同步 的相关文章

  • GPU 显存带宽理论与实际

    作为在 GPU 上运行的算法分析的一部分 我觉得我正在达到内存带宽的要求 我有几个复杂的内核执行一些复杂的操作 稀疏矩阵乘法 归约等 和一些非常简单的操作 当我计算每个内核读取 写入的总数据时 似乎所有 重要的 都达到了约 79GB s 的
  • 为什么 AMD GCN 使用非零 NULL?

    这次提交 https reviews llvm org rL289252 says In amdgcn https en wikipedia org wiki Graphics Core Next目标 全局 常量和通用地址空间中的空指针取值
  • PyOpenCL 矩阵乘法

    我有使用 pyopenCL 进行矩阵乘法的代码 我的问题是某些矩阵的结果是错误的 我不明白为什么 经过一番研究后 我认为它与类似的全球规模有关 但我不明白如何设置该值 例如 使用 numpy dtype float32 的矩阵 矩阵1 0
  • NVIDIA GPU 的 CUDA 核心和 OpenCL 计算单元之间有什么关系?

    我的电脑有一块 GeForce GTX 960M NVIDIA 声称它有 640 个 CUDA 核心 然而 当我运行 clGetDeviceInfo 来查找计算机中的计算单元数量时 它打印出 5 见下图 听起来 CUDA 核心与 OpenC
  • opencl支持布尔变量吗?

    openCL 支持布尔变量吗 我目前正在使用 JOCL java 编写我的 openCL 调用代码 但我没有看到任何有关布尔值的信息 tl dr 是的 但是你应该在内核函数签名中避免它 是的 但a的大小bool is not定义的 因此 它
  • 多个 OpenCl 内核

    我只是想问 是否有人可以提醒我在相继使用几个简单内核时要注意什么 我可以用同样的吗CommandQueue 我可以跑几次吗clCreateProgramWithSource cl program与不同的cl program 我忘记了什么 T
  • boost::计算流压缩

    如何使用 boost compute 进行流压缩 例如 如果您只想对数组中的某些元素执行繁重的操作 首先 生成掩码数组 其中包含与要执行操作的元素相对应的元素 mask 0 0 0 1 1 0 1 0 1 然后对掩码数组进行排它扫描 前缀和
  • GPU 上非原子写入的保证很弱吗?

    OpenCL 和 CUDA 包含原子操作已有好几年了 尽管显然并非每个 CUDA 或 OpenCL 设备都支持这些操作 但是 我的问题是关于由于非原子写入而 共存 种族的可能性 假设网格中的多个线程都写入全局内存中的同一位置 我们是否可以保
  • OpenCL 在调用 clGetPlatformIDs 时崩溃

    我是 OpenCL 新手 在配备 Intel R HD Graphics 4000 运行 Windows 7 的 Core i5 计算机上工作 我安装了支持 OpenCL 的最新 Intel 驱动程序 GpuCapsViewer 确认我有
  • cudaMemcpyToSymbol 的问题

    我正在尝试复制到恒定内存 但我不能 因为我对 cudaMemcpyToSymbol 函数的用法有误解 我正在努力追随this http developer download nvidia com compute cuda 4 1 rel t
  • Visual Studio - 过滤掉 nvcc 警告

    我正在编写 CUDA 程序 但收到令人讨厌的警告 Warning Cannot tell what pointer points to assuming global memory space 这是来自 nvcc 我无法禁用它 有没有办法过
  • 官方 OpenCL 2.2 标准是否支持 WaveFront?

    众所周知 AMD OpenCL 支持 WaveFront 2015 年 8 月 http amd dev wpengine netdna cdn com wordpress media 2013 12 AMD OpenCL Programm
  • Linux 上的 OpenCL 编译

    我是 OpenCL 的新手 从昨天开始 我尝试使用 OpenCL 进行并行编程 而不是使用我更熟悉且以前体验过的 CUDA 现在我有 NVIDIA GTX 580 GPU Ubuntu Linux 12 04 操作系统和 CUDA SDK
  • OpenCL 与 OpenMP 性能对比 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否有研究比较 OpenCL 与 OpenMP 的性能 具体来说 我对使用 OpenCL 启动线程的开销成本感兴趣 例如 如果将域分解
  • 如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?

    我正在使用在 Windows 7 上运行的开源触觉和 3D 图形库 Chai3D 我重写了该库以使用 Nvidia nvision 执行立体 3D 我将 OpenGL 与 GLUT 一起使用 并使用 glutInitDisplayMode
  • OpenCL 何时使用全局、私有、本地、常量地址空间

    我正在尝试学习 OpenCL 但我很难决定使用哪些地址空间 因为我只找到组装的资源声明这些地址空间是什么 但没有声明它们为什么存在或何时使用它们 资源至少太分散了 所以带着这个问题我希望把所有这些信息汇总一下 所有地址空间是什么 它们为什么
  • 如何在 Emgu CV 项目中利用 OpenCL

    我是使用 Emgu CV 的新手 并开始创建小型示例项目 例如面部检测 眼睛检测等 如果我可以利用 OpenCL 来加速使用 GPU 的过程 那就太好了 否则 当我降低scaleFactor时 它会导致大量的CPU利用率 我怎样才能做到这一
  • 如何在 pyopencl 中创建可变大小的 __local 内存?

    在我的 C OpenCL 代码中我使用clSetKernelArg创建 可变尺寸 local我的内核中使用的内存 OpenCL 本身不提供该内存 看我的例子 clSetKernelArg clKernel ArgCounter sizeof
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • 无法初始化 NVML:几个小时后 Docker 中出现未知错误

    我遇到有趣而奇怪的问题 当我使用 GPU 启动 docker 容器时 它工作正常 并且我看到 docker 中的所有 GPU 然而 几个小时或几天后 我无法在docker中使用GPU 当我做nvidia smi在泊坞窗机器中 我看到这条消息

随机推荐