Questions tagged «parallel-computing»

通过同时使用多个处理器来解决计算问题的研究。

1
如何在共享内存模式(如OpenMP)中运行MPI-3.0
我正在并行化代码以数字方式求解5维人口平衡模型。当前,我在FORTRAN中有一个很好的MPICH2并行化代码,但是随着我们增加参数值,数组变得太大而无法在分布式内存模式下运行。 我可以访问具有15个节点的群集,其中每个节点具有两个8个核心CPU和128GB RAM。我想在共享内存模式下以MPI-3.0编写运行程序,以便每个进程都不会生成每个数组的自己的副本。 在集群上运行任何东西之前,必须在运行Ubuntu的桌面上对其进行测试。它实质上是集群的一个刀片,因为它具有两个8个核心CPU和128 GB的RAM。我将在上面编写和测试我的代码,因此请针对在Ubuntu计算机上运行程序调整您的响应。 我已经读到有一种方法可以在共享内存模式(如OpenMP)而不是其默认的分布式内存模式下运行MPI-3.0。 问题: 我将如何更改我的代码?我是否需要添加对其他MPI函数的调用MPI_WIN_ALLOCATE? 如何编译我的代码以在共享内存模式下运行MPI-3.0?如果跨越多个节点,情况会有所不同吗? 请提供示例编译脚本。我也只有GNU编译器。我使用的群集不支持Intel编译器。

5
使用时空并行的PDE计算示例
在初始边界值PDEs的数值解中,在空间中采用并行性是很常见的。在时间离散化中采用某种形式的并行性的情况要少得多,并且并行性通常受到更大的限制。我知道越来越多的代码和已发表的作品展示了时间并行性,但是它们都不包含空间并行性。 是否有在空间和时间上都包含并行性的实现示例?我对出版物和可用代码都感兴趣。

4
对与使用MPI的代码/库兼容的单元测试框架有何建议?
通常,我编写串行代码,然后编写,并使用一些xUnit风格的测试框架(MATLAB xUnit,PyUnit / nose或Google的C ++测试框架)编写单元测试。 基于对Google的粗略搜索,关于从业人员如何对使用MPI的测试代码进行单元化的知识很少。有什么最佳实践吗? 与单元测试和测试驱动的开发策略相比,我正在寻找与应该用于测试框架的软件有关的答案(如果存在的话,答案很可能是“编写自己的代码”),其中自定义测试代码的案例示例会很有帮助)。 我要测试的大部分内容都是用于右侧步进功能的评估以及用于时间步进器的Jacobian矩阵汇编例程,这些例程将集成半离散的PDE。我将使用PETSc,因此,如果有PETSc特定的内容,那么除了更通用的测试框架之外,这也将有所帮助。 澄清度编辑: 一个示例将在中${PETSC_DIR}/src/ts/examples/tutorials/ex2.c,在该示例中,我想测试类似的内容RHSFunction(右侧函数评估),然后RHSJacobian(雅可比矩阵评估)。我将针对组装好的右侧和组装好的Jacobian矩阵的已知值进行测试;对于一些简单的问题实例,我可以通过分析获得这些值。这些函数是特定于应用程序的函数,不会执行任何其他应用程序级函数,但是如果在函数内完成矢量或矩阵汇编,则可以调用MPI(如上面的链接PETSc示例中所示)。如果我编写的函数仅计算处理器局部的矢量或矩阵的部分,则我将尽可能对全局汇编版本进行测试,因为对于并行编程来说,这是我的第一次直观思考全局矢量和全局矩阵。这些测试将在较小的问题规模和少量的处理器上运行。 我可以想到一些实现此目的的策略: 根据我在该主题上所做的Google搜索,一种可能效果不佳的策略是构造一个已知的输出,并行找到相对/绝对误差,然后进行幼稚的比较。输出可能会出现乱码 -任何使用MPI编写“ Hello,world”程序的人都知道原因-这限制了进行单元测试的效用。(这是提出问题的动力。)在调用单元测试框架时,似乎还存在一些潜在的棘手问题。 写输出到文件(PETSc中,例如,使用VecView和MatView),和比较反对的东西,如已知的输出ndiff或numdiff。我从以前通过文件比较进行单元测试的经验中得到的这种方法的直觉是,它会很挑剔,并且需要进行一些过滤。但是,此方法似乎非常适合进行回归测试,因为我可以将上述实用程序替换为plain diff,而不必担心匹配文本格式。我已经收集到该策略或多或少是WolfgangBangerth和Andybauer所建议的。PETSc似乎也使用类似的方法进行某些测试。 使用单元测试框架,将所有信息收集到MPI等级为0的处理器上,并仅在处理器等级为0时要求它执行单元测试。我可以对规范做类似的事情(这种方式可能更容易),尽管需要权衡取舍就是返回的任何错误都会告诉我我的计算有问题,但是哪些元素没有错误。然后,我不必担心任何单元测试输出都会出现乱码。我只需要担心正确调用单元测试框架。当确切的解决方案可用时,PETSc似乎在其示例程序中使用基于规范的比较,但进行比较时,它不使用单元测试框架(也不必这样做)。

4
异步蜂窝自动机的并行(GPU)算法
我有一组计算模型,这些模型可以描述为异步蜂窝自动机。这些模型类似于Ising模型,但稍微复杂一些。这样的模型似乎可以从在GPU而非CPU上运行中受益。不幸的是,并行化这样一个模型不是很简单,而且我也不清楚如何去实现它。我知道有关于该主题的文献,但似乎所有这些文献都是针对对算法复杂性细节感兴趣的铁杆计算机科学家,而不是像我这样只想要描述我可以实现的东西的人,以及因此,我觉得它是不可渗透的。 为了清楚起见,我并不是在寻找最佳算法,而是希望可以在CUDA中快速实现的最佳算法比我的CPU实现有明显的提高。在这个项目中,程序员的时间比计算机的时间更多地是一个限制因素。 我还应该澄清,异步蜂窝自动机与同步自动机是完全不同的事情,并且并行化同步CA的技术(例如Conway的生活)不能轻易地适应此问题。区别在于,同步CA在每个时间步同时更新每个小区,而异步CA在每个时间步更新随机选择的本地区域,如下所述。 我希望并行化的模型是在由约100000个单元组成的网格(通常是六角形)上实现的(尽管我想使用更多),用于运行它们的非并行算法如下所示: 随机选择一对相邻的单元格 根据围绕这些单元格的局部邻域计算“能量”函数Δ èΔË\Delta E 以取决于的概率(使用为参数),要么交换两个单元的状态,要么不执行任何操作。Ë- βΔ èË-βΔËe^{-\beta \Delta E}ββ\beta 无限重复上述步骤。 边界条件也有一些复杂性,但是我想这些对于并行化不会造成太大困难。 值得一提的是,我对这些系统的瞬态动力学感兴趣,而不仅仅是平衡状态,因此我需要具有与上述等效的动力学特性的东西,而不是仅仅具有相同平衡分布的东西。(因此,chequerboard算法的变化不是我想要的。) 并行化上述算法的主要困难是冲突。由于所有计算仅取决于晶格的局部区域,因此许多晶格位点可以并行更新,只要它们的邻域不重叠即可。问题是如何避免这种重叠。我可以想到几种方法,但是我不知道哪种方法最适合实施。这些如下: 使用CPU生成随机网格站点的列表并检查冲突。当网格站点的数量等于GPU处理器的数量时,或者如果检测到冲突,请将每组坐标发送到GPU单元以更新相应的网格站点。这将很容易实现,但可能不会大大提高速度,因为检查CPU上的冲突可能不会比对CPU进行整个更新便宜得多。 将网格划分为区域(每个GPU单元一个),并拥有一个GPU单元负责随机选择和更新其区域内的网格单元。但是这个想法有很多我不知道如何解决的问题,最明显的是当一个单位选择一个与其区域边缘重叠的邻域时应该发生什么。 大致如下所示:让时间分步进行。将晶格分成不同的根据某个预定义方案在每个时间步上设置一组区域,并让每个GPU单元随机选择和更新一对邻域不与区域边界重叠的网格单元。由于边界每时每刻都在变化,因此只要区域相对较大,此约束就不​​会对动力学产生太大影响。这似乎易于实现并且可能很快,但是我不知道它对动态的近似程度,或者在每个时间步长上选择区域边界的最佳方案是什么。我发现了一些对“块同步细胞自动机”的引用,它们可能与这个想法相同或不同。(我不知道,因为似乎该方法的所有描述要么都是俄语的,要么是我无法访问的资源。) 我的具体问题如下: 以上任何算法是否是处理异步CA模型的GPU并行化的明智方法? 有没有更好的办法? 是否存在针对此类问题的现有库代码? 在哪里可以找到“块同步”方法的清晰英语描述? 进展 我相信我已经想出了一种可能合适的并行化异步CA的方法。下面概述的算法适用于一次仅更新一个单元的普通异步CA,而不是像我的那样更新相邻的一对单元。将其推广到我的具体情况有一些问题,但是我认为我有一个解决方案的想法。但是,由于下面讨论的原因,我不确定它将带来多少速度优势。 这个想法是用等效的随机同步CA(SCA)代替异步CA(以下称为ACA)。为此,我们首先想到ACA是一个泊松过程。即,时间连续进行,并且每个单元以每单位时间执行其更新功能的恒定概率独立于其他单元。 我们构造了一个SCA,该SCA的每个单元均存储两件事:该单元的状态 (即,在顺序实现中将存储在每个单元中的数据),以及一个浮点数代表(连续)时,在其将在下一次更新。此连续时间不对应于SCA的更新步骤。我将后者称为“逻辑时间”。时间值根据指数分布随机初始化:。(其中是一个可以任意选择其值的参数。)X我ĴX一世ĴX_{ij}Ť我ĴŤ一世Ĵt_{ij}Ť我Ĵ(0 )〜精通(λ )Ť一世Ĵ(0)〜经验值⁡(λ)t_{ij}(0) \sim \operatorname{Exp}(\lambda)λλ\lambda 在每个逻辑时间步,SCA的单元将更新如下: 如果对于附近的任何,时间,则不执行任何操作。ķ ,升ķ,升k, l我,Ĵ一世,Ĵi,jŤķ 升&lt; 吨我ĴŤķ升&lt;Ť一世Ĵt_{kl}<t_{ij} 否则,(1)使用与原始ACA相同的规则,根据相邻小区的状态更新状态;(2)生成一个随机值并将更新为。X我ĴX一世ĴX_{ij}Xķ 升Xķ升X_{kl}Δ 吨〜精通(λ )ΔŤ〜经验值⁡(λ)\Delta t \sim \operatorname{Exp}(\lambda)Ť我ĴŤ一世Ĵt_{ij}Ť我Ĵ+ Δ 吨Ť一世Ĵ+ΔŤt_{ij}+\Delta t …

3
在并行有限元计算中管理网格的最佳方法?
我目前正在开发一种域分解方法来解决散射问题。基本上,我正在迭代地解决Helmholtz BVP系统。我在三角形或四面体网格上使用有限元方法离散化方程。我正在为我的博士学位论文开发代码。我知道一些现有的有限元库,例如Deal.ii或DUNE,尽管我认为它们很棒,具有鼓舞人心的设计和API,但出于学习目的,我想从头开始开发自己的小应用程序。 我现在正在运行我的串行版本,现在我想对其进行并行化。毕竟,至少在原则上,制定易于并行化的算法是领域分解框架的优势之一。但是实际上,有许多细节必须考虑。网格管理就是其中之一。如果应用程序在达到高分辨率的同时可以很好地扩展到许多CPU,则在每个CPU上复制整个网格的效率很低。 我想问那些在高性能计算环境中从事类似应用程序工作的开发人员如何处理此问题。 有用于分布式网格管理的p4est库。我不需要AMR,所以这可能是一个过大的选择,因为我只对使用统一网格感兴趣,并且不确定是否可以优化三角形网格。我也可以简单地创建一个统一的网格,然后将其输入到网格划分器之一中,并对输出进行一些后期处理。 最简单的方法似乎是为每个分区创建一个单独的文件,其中包含仅与该特定分区相关的网格信息。该文件将由单个CPU读取,该CPU负责在网格的该部分上组装离散系统。当然,某些全局分区连接性/邻居信息也需要存储在所有CPU读取的文件中以进行进程间通信。 还有哪些其他方法?如果你们中的一些人可以分享,那么与该问题相关的行业或政府研究机构中最常用的方法有哪些?对于编程并行有限元求解器,我是一个新手,我想了解一下我是否在正确地考虑这个问题以及其他人如何解决这个问题。任何有关相关研究文章的建议或指针将不胜感激! 提前致谢!

3
我正在寻找C ++中的并行动态图库
您好scicomp社区, 我曾使用诸如NetworkX(Python),JUNG和YFiles(Java)之类的框架从事图算法研究。我现在正在进入并行和高性能计算领域。对于一个新项目,我正在寻找具有以下功能的C ++图形库: 具有直观的界面,可进行算法开发 支持动态操作:例如,任意节点/边缘的插入和删除 支持并行化:例如,使程序员免受多线程问题的影响 内存开销低,适合高性能计算 请建议一些图书馆,并讨论这些标准以及利弊。

2
共享内存并行编程的Python指南
我有为共享内存机器(在C和FORTRAN中)编码OpenMP的经验,可以执行简单的任务,例如矩阵加法,乘法等(仅看它如何与LAPACK竞争)。我知道OpenMP足以执行简单的任务,而无需查看文档。 最近,我转到我的项目中使用Python,除了绝对的基础知识之外,我没有Python方面的经验。 我有两个问题: 有没有很好的指南(在线PDF)来描述Python的共享内存并行计算? 实现它的最佳方法是什么?我看过一点,ctypes我不确定这是否是最好的方法。(最好的意思是,在程序员时间和系统时间之间要有一个很好的权衡。编码也不应该太繁琐,执行速度也不应该太慢)


5
集中精力学习数学或计算是否更可取?
在研究Krylov子空间方法的同时,我可以选择探索HPC背后的数学或计算理论(硬件,OS,编译器等)领先一步。目前,我知道,这两个足以只是通过获得。例如,我知道如何推导CG方程和迭代方法的基础,但是对于细节和诸如Preconditioners和Convergence之类的更复杂的东西我一无所知。同样,我知道有限元方法的基础(弱形式,非弱形式,诸如Codomain和Galerkin之类的东西),但不知道其深度。在计算方面,我知道如何以所有可能的语言进行串行编码,并且可以很好地使用OpenMP和MPI。我不太了解硬件和缓存。 我的问题是:一个人应该专注于什么:数学或计算?它们在HPC中密不可分吗?是否建议一个人了解一个而不是另一个? 编辑:我目前主修机械工程(我很遗憾),并且有大量的工程和计算课程(流体,传热等)。我今年将加入HPC研究生院,在开始研究生学习之前,我想加强一些方面(数学/比较/混合)。我同样喜欢数学和数学(因此“尽享更多乐趣”是多余的)。

1
Parareal,PITA和PFASST有什么区别?
Parareal,PITA和PFASST算法都是跨域技术,用于并行解决时间相关问题的解决方案。 这些方法背后的指导原则是什么? 它们之间的主要区别是什么? 我可以说一个基于另一个吗?怎么样? 那他们的应用呢? 我知道对“哪个更好?”这个问题没有答案,但是对它们的应用领域和验证条件的充分了解对我有帮助。

1
隐式时间离散化的cuda和数值方法
我希望移植一些通过IMPLICIT形式的有限体积方法(用于时间离散化)解析一组偏微分方程(PDE)的代码。 结果,存在由ADI / TDMA方案处理的x,y,z方向上的三对角方程组。 我似乎找不到关于使用CUDA进行PDE的隐式解决方案的任何信息。 ADI / TDMA方案是否可以在CUDA中实现?某处是否有类似2D热扩散方程的示例? 我所能找到的是一个二维热扩散方程的CUDA示例代码,它具有有限的差异,但形式为EXPLICIT(剑桥大学)。 任何提示/参考将不胜感激。

5
大型稀疏对称(但不是正定)系统的求解器的最佳选择
我目前正在研究由某些算法生成的非常大的对称(但不是正定)系统。这些矩阵具有很好的块稀疏性,可用于并行求解。但是我无法决定是否应该使用直接方法(例如多边方法)还是迭代方法(预处理GMRES或MINRES)。我所有的研究都表明,迭代求解器(即使具有7个内部迭代的快速收敛)也无法击败MATLAB中的直接“ \”运算符。但是从理论上讲,直接方法应该更昂贵。这是怎么回事?是否有最新的文件或纸张用于此类情况?我可以在使用直接方法的并行系统中使用块稀疏性,就像GMRES这样的灵活迭代求解器一样有效吗?

2
科学计算中基于任务的共享内存并行库
近年来,出现了一些库/软件项目,它们提供了某种形式的通用数据驱动的共享内存并行性。 主要思想是,程序员无需编写显式的线程代码,而是将其算法实现为相互依赖的任务,然后由共享内存计算机上的通用中间件动态调度这些任务。 此类库的示例是: 夸克:最初是为MAGMA并行线性代数库设计的,似乎也已用于并行快速多极子方法。 Cilk:最初是一个基于MIT的项目,现在得到了Intel的支持,实现为C的语言/编译器扩展,用于Cilkchess计算机国际象棋软件以及FFTW中。 SMP superscalar:在巴塞罗那超级计算中心开发,基于#pragma扩展在很多方面类似于Cilk 。 StarPU:基于类似库的“小代码”,可以针对几种不同的体系结构(包括GPU)进行编译和调度。 OpenMP任务:从3.0版开始,OpenMP引入了可以异步调度的“任务”(请参阅​​规范的2.7节)。 英特尔的线程构建基块:使用C ++类创建和启动异步任务,请参阅教程的第11节。 OpenCL:在多核上支持基于任务的并行性。 尽管有很多文献描述了这些库/语言扩展的内部工作方式以及它们在特定问题上的应用,但我仅遇到了很少的例子将它们用于科学计算应用中。 所以这是一个问题:是否有人知道使用这些库/语言扩展中的任何一个或类似的用于共享内存并行性的科学计算代码?

3
推动GPU编程
我对GPGPU编程非常陌生,所以如果这个问题不是特别合适,请原谅我。据我了解,与通常的CPU编程相比,GPU编程是一项非常复杂的工程工作。必须注意发散性问题,切片,固定的内存分配以及主机设备通信/设备计算重叠。 经过一些研究后,我发现了推力库,它似乎试图模仿C ++ STL。很好 但是,基于我非常有限的经验,并且看到了获得良好性能所需的所有微观管理,我对性能有些怀疑。能否有效地内部处理所有复杂的编程部分?一些非常著名的库(例如PETSc)似乎使用了此软件包,这使我相信它应该以某种方式出现。 我想知道,与低级CUDA编程相比,对CUDA有更多经验和推力的人能否对软件包的性能说一两句话。什么时候可以使用推力?什么时候应该切换回CUDA?

2
密集病态矩阵的对角化
我正在尝试将一些稠密,病态的矩阵对角化。在机器精度方面,结果不准确(返回负特征值,特征向量不具有预期的对称性)。我切换到Mathematica的Eigensystem []函数以利用任意精度,但是计算速度非常慢。我愿意接受许多解决方案。是否有非常适合病态问题的软件包/算法?我不是预处理方面的专家,所以我不确定这有多大帮助。否则,我所能想到的就是并行化的任意精度特征值求解器,但是我对Mathematica,MATLAB和C ++并不熟悉。 为了提供一些有关此问题的背景,矩阵很大,但不是很大(最多4096x4096至32768x32768)。它们是实数,是对称的,特征值在0到1(不包括)之间,许多特征值非常接近0,没有一个接近1。矩阵本质上是卷积算符。我不需要对所有矩阵进行对角线化,但是我可以走的越大越好。我可以访问具有许多处理器和分布式计算功能的计算集群。 谢谢

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.