学习共享内存、分布式内存和/或 GPU 编程的典型问题和解决方案是啥?

Posted

技术标签:

【中文标题】学习共享内存、分布式内存和/或 GPU 编程的典型问题和解决方案是啥?【英文标题】:What is an exemplar problem and solution for learning shared memory, distributed memory, and/or GPU programming?学习共享内存、分布式内存和/或 GPU 编程的典型问题和解决方案是什么? 【发布时间】:2011-08-10 17:16:18 【问题描述】:

我们正在寻找可在任何或所有共享内存、分布式内存和 GPGPU 架构上运行的示例问题和代码。我们使用的参考平台是 LittleFe (littlefe.net),这是一个开放式设计、低成本的教育集群,目前有六个双核 CPU,每个 CPU 都有一个 nVidia 芯片组。

这些问题和解决方案将有助于向任何新手教授并行性,提供工作示例和机会来卷起袖子和代码。 *** 专家有很好的洞察力,并且可能有一些收藏夹。

计算曲线下的面积很有趣,简单易懂,但肯定有一些同样容易表达,并且充满了练习和学习的机会。

使用一种以上内存架构的混合示例是最可取的,并且反映了并行编程的趋势似乎在哪里。

在 LittleFe 上,我们主要使用三个应用程序。第一个是对飞镖上最佳目标的分析,该飞镖高度并行且通信开销很小。第二个是康威的生命游戏,这是一个典型的共享边界条件的问题。它具有适度的通信开销。第三个是星系形成的 n 体模型,需要大量的通信开销。

【问题讨论】:

【参考方案1】:

CUDA programming guide(PDF) 包含对 GPU 上矩阵乘法实现的详细分析。这似乎是学习 GPU 编程的主要“hello world”示例。

此外,CUDE SDK 包含数十个其他解释清楚的 CUDA 和 OpenCL 中的 GPU 编程示例。我最喜欢的是碰撞球的例子。 (数千个球实时碰撞的演示)

【讨论】:

Sweet,自从《和米奇一起唱》以来,人们就喜欢弹跳球,也许可以修改它来展示理想气体定律。【参考方案2】:

我最喜欢的两个是数值整数和寻找素数。首先,我们在函数 f(x) = 4.0 / (1.0 + x*x) 上编写中点矩形规则。函数在 0 和 1 之间的积分给出了常数 pi 的近似值,这使得检查答案的正确性变得容易。并行度跨越积分范围(计算矩形的面积)。

对于第二个,我们输入一个整数范围,然后识别并保存该范围内的素数。我们使用所有可能的因素对值进行强力划分;如果发现任何除数不是 1 或数字,则该值是合数。如果找到素数,则对其进行计数并存储在共享数组中。并行性正在划分范围,因为 N 的素数测试独立于 M 测试。在线程之间共享素数存储或收集分布式部分答案需要一些技巧。

这些都是非常基本且易于解决的问题,这使学生可以专注于并行实现,而不是过多地关注所涉及的计算。

【讨论】:

谢谢克莱。我知道我最喜欢的线猴会有一些很棒的建议。 Clay、Andrew Fitz Gibbon 和我在 Fitz 和我任教的 Petascale 研究所结束时相遇,从事 ACM 技术包 2 的并行编程工作。我使用了一个直接与单位圆方程相关的变体,x^2 + y^2 = 1,求解 y 得到 y=sqrt(1-x^2)。将其下方的面积从 -1 到 1 得出半圆的面积,即 pi/2。我在 Petascale 研究所用它来教授 mpi 点对点通信,也作为伯克利 Map-Reduce 主题的一个例子。其他人扩展了我的此代码的串行版本来教授 OpenMP 和 Cuda。【参考方案3】:

其中一个更复杂但更简单的示例问题是 BLAS 例程 sgemm 或 dgemm (C = alpha * A x B + beta * C),其中 A、B、C 是有效大小的矩阵,而 alpha 和 beta 是标量。类型可以是单精度浮点 (sgemm) 或双精度浮点 (dgemm)。

在不同的平台和架构上实现这个简单的例程,让我们了解了一些关于功能和工作原理的见解。有关 BLAS 和 ?gemm 例程的更多详细信息,请查看http://www.netlib.org/blas。

您只需要注意,对于 GPU 上的双精度实现,GPU 需要具有双精度功能。

【讨论】:

这是一个很好的建议。谢谢。它也自然而然地引发了对 BLAS 和其他数值库的调查/讨论。第二个出发点是讨论误差,从单精度到双精度并获得相同的结果并不足以验证算法的数值稳定性

以上是关于学习共享内存、分布式内存和/或 GPU 编程的典型问题和解决方案是啥?的主要内容,如果未能解决你的问题,请参考以下文章

分布式深度学习(Spark MLlib,Parameter ServerRing-allreduce和Tensorflow )

nvidia cuda访问gpu共享内存

gpu共享内存几乎不被使用,共享gpu内存用不了

JMM学习篇

cuda学习3-共享内存和同步

并发编程相关知识