Questions tagged «parallel-computing»

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

4
“ Julia”科学计算语言项目的成熟程度如何?
我正在考虑学习一种用于数值/模拟建模项目的新语言,以(部分)替代当前使用的C ++和Python。我遇到了朱莉娅,这听起来很完美。如果它能完成它声称的一切,我可以用它来代替C ++ 和在所有项目中 Python,因为它可以访问高级科学计算库代码(包括PyPlot),并且可以以与C相似的速度运行循环。我还将受益于其他语言中都不存在的诸如适当的协程之类的东西。 但是,这是一个相对较新的项目,当前版本为0.x,我发现各种警告(在过去的不同日期发布)表明它还不能为日常使用做好准备。因此,我想立即获得有关该项目状态的一些信息(2014年2月,或每当发布答案时),以帮助我评估我个人是否应考虑在此阶段花时间学习这种语言。 我希望您能获得有关朱莉娅项目具体相关事实的答案。 ; 我对基于其他项目经验的观点不感兴趣。 特别是,Geoff Oxberry的评论表明,Julia API仍处于不断变化的状态,需要在代码更改时对其进行更新。我想了解一下这种情况的程度:API的哪些区域是稳定的,哪些区域可能会发生变化? 我想通常我通常会做线性代数(例如,解决本征问题),对具有多个变量的ODE进行数值积分,使用PyPlot和/或OpenGL进行绘图以及低级C样式数字运算(例如,用于蒙特卡洛模拟) )。朱莉娅的图书馆系统在这些领域是否得到充分发展?尤其是对于这些类型的活动,API或多或少是稳定的,还是我会发现我的旧代码在升级到新版本的Julia后会趋于破坏? 最后,在确定当前是否使用Julia进行认真的工作时,还有其他值得考虑的问题吗?

3
并行ODE方法的最新技术水平是什么?
我目前正在研究ODE集成的并行方法。有很多新旧文献描述了各种各样的方法,但是我没有发现任何有关该主题的最新调查或概述文章。 Burrage着有这本书[1],但是它已经有20多年的历史了,因此没有涵盖许多更现代的想法,例如超现实算法。 [1] K. Burrage,常微分方程的并行和顺序方法,克拉伦登出版社,牛津,1995年


7
在Python中并行化for循环
Python中是否有任何类似Matlab parfor的工具?我找到了这个线程,但是已经有四年了。我认为也许有人在这里可能有更多的近期经验。 这是我要并行化的事物类型的示例: X = np.random.normal(size=(10, 3)) F = np.zeros((10, )) for i in range(10): F[i] = my_function(X[i,:]) where my_function取一个ndarraysize (1,3)并返回一个标量。 至少,我想同时使用多个内核,例如parfor。换句话说,假设具有8到16核的共享内存系统。



8
哪种软件适合用于并行调试?
我现在不运行任何并行代码,但是我希望将来使用OpenMP和MPI的混合运行并行代码。对于我来说,运行串行项目时,调试器是非常宝贵的工具。 谁能推荐并行调试器(或多个调试器)用于调试并行软件?自由软件将是更可取的选择,但请毫不犹豫地提及有效的商业软件。

3
并行I / O选项,尤其是并行HDF5
我有一个可以并行化的应用程序,但其性能在很大程度上受到I / O的限制。该应用程序读取存储在文件中的单个输入数组,该文件的大小通常为2-5 GB(但我希望这个数字将来会增长)。典型的计算将相同的操作应用于该数组的每一行或每一列。对于CPU繁重的操作,我可以很好地扩展到大约100个处理器,但是对于较慢的操作,I / O和相关的通信(NFS访问)占主导地位,并且我不能有效地使用几个以上的处理器。 在这种情况下,什么是有效且可移植的(理想情况下是高效的)选项?并行HDF5似乎很有希望。有没有人有现实生活中的经验? MPI-I / O是否值得研究?它可以在给定的文件布局下有效地工作,还是必须调整所有内容?

4
是否有用于结构化网格自适应网格细化的通用库?
想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 自适应网格细化(AMR)是解决PDE数值解中空间尺度变化很大的常见技术。在结构化网格上存在哪些针对AMR的通用库?理想情况下,我希望本着PETSc的精神,库仅处理自适应网格,而我提供物理和离散化(有限差分/体积/元素)。 理想的图书馆是 模块化:不决定如何编写代码或过多的数据结构 General:不在乎我使用的是哪种离散化 高效:不会产生太多开销 并行且高度可扩展 仅适合这些条件中的一个子集的库仍将受到关注。 附录:我知道Donna Calhoun的AMR软件包的详细列表,但是我不知道其中哪个(如果有)符合上述条件。因此,我主要感兴趣的是听取具有一个或多个(或更多)软件包的实际经验的人,以了解他们如何衡量这些术语。

3
对数-对数并行缩放/效率图
我的许多工作都围绕使算法更好地扩展而展开,而显示并行扩展和/或并行效率的首选方法之一是在内核数量上绘制算法/代码的性能,例如 其中,轴表示核心数,轴表示某种度量,例如,每单位时间完成的工作。不同的曲线显示在64个磁芯上的并行效率分别为20%,40%,60%,80%和100%。XXxÿÿy 但不幸的是,在许多出版物,这些结果绘制了对数标度,例如在结果本或本文件。这些对数-对数图的问题在于,评估实际的并行缩放/效率非常困难,例如 与上面的图相同,但具有对数-对数缩放。请注意,并行效率为60%,80%或100%时,结果之间没有太大差异。我在这里对此进行了更广泛的写作。 所以这是我的问题:在对数对数缩放中显示结果有什么理由?我经常使用线性标度来显示自己的结果,并经常被裁判员锤击,说我自己的并行标度/效率结果看起来不如其他人的(对数-对数)结果,但在我的生命中,我无法看到为什么我应该切换绘图样式。

5
如何解决数值非关联性以进行并行约简?
并行归约假设相应的操作是关联的。添加浮点数违反了该假设。您可能会问为什么我对此很在意。好吧,它使结果的再现性较差。当使用模拟退火来优化(或拟合参数)子程序时,情况变得更糟,从而产生不可再现的结果。 解决此问题的常用方法是什么?关于以下策略可以说些什么? 不在乎不可复制性。 不要对浮点数和加法运算使用并行约简。 以可复制的方式创建适当大小的工作包,并手动进行最终缩减。 使用更高的精度进行添加(但并非所有编译器都提供更高精度的浮点类型)。

5
有没有一个好的,易于使用的高质量开源CFD求解器?
我的论文是研究燃烧模型简化的数值方法。我的方法纯粹是在燃烧模拟的化学部分上运行的,并且我有大量的0D模拟案例研究(无流量)。我想要的是运行确实包含模拟的模拟,最好是2-D或3-D模拟。 由于计算量大,因此这些仿真需要并行进行。我还需要一些可以与化学求解器(例如Chemkin或Cantera)交互的东西,我已经有了它们的源代码。(Chemkin在Fortran 77中,而Cantera在C ++中。) 在理想情况下,我可以使用我在grad程序和一些CFD软件包中获得的流体力学基础知识来指定一种流动模式,添加化学成分并运行它。如果需要的话,我可以根据前合作者使用的实验设置,为简单的案例研究建立控制流体运动和化学反应的方程式,但是我非常希望不要滚动自己的CFD代码,除非有一个或多个非常容易实现的软件包。我愿意花2-3周的时间;我不知道此要求是否排除了PETSc或Trilinos。如果我不得不花更多的时间,我宁愿推迟到以后再做,因为我有一个合作者也提供CFD代码用于案例研究。 有没有人有使用CFD软件包或编写CFD代码的经验,如果有,您可以推荐一个吗?我知道我想使用的一件事是Strang拆分,但是我不是CFD或PDE专家。我研究化学和模型还原的数值方法。另外,请评论您使用推荐的软件花了多长时间才能上手。 @FrenchKheldar很好地指出了我要解决的问题的特征: 理想(完美)气体,单相 可压缩 层流必不可少;湍流优先。(我从CFD数值方法的先前工作中了解了一些湍流,但是我还没有从事CFD求解器的工作;我只对物理学有一点了解。) 零马赫数公式是可以的(我不在乎冲击或超音速流动) 燃烧化学,忽略Soret和Dufour的通量,并将扩散视为Fickian 几何可以很简单 我可以编写接口代码,尽管我写的越少越好。@FrenchKheldar还指出Cantera具有Fortran和Python绑定。我现在使用Cantera Python绑定进行快速原型制作,因此我也对这些感到满意。

5
目标函数非常昂贵的问题的并行优化算法
我正在优化10-20个变量的函数。坏消息是每个功能评估都很昂贵,大约需要30分钟的串行计算时间。好消息是我有一个群集,其中包含几十个计算节点。 因此,问题是:是否存在可用的优化算法,这些算法可以使我有效地利用所有这些计算能力? 频谱的一侧将是穷举搜索:将整个搜索空间细分为一个精细的网格,并在每个网格点上独立计算函数。这当然是非常并行的计算,但是该算法效率非常低。 频谱的另一端是准牛顿算法:根据先前的历史智能更新参数的下一个估计。这是一种有效的算法,但我不知道如何使其并行:“基于先前历史估计参数”的概念听起来像是串行计算。 二次算法似乎处于中间位置:可以通过并行计算一堆值来构建初始的“代理模型”,但是我不知道其余迭代是否可并行化。 关于哪种无梯度优化方法在群集上能很好地表现出什么建议?此外,目前是否有并行的优化算法实现方案?

3
粒子分解和域分解并行化算法的优缺点是什么?
我正在使用几个软件包(例如Gromacs和DL_POLY)运行分子动力学(MD)模拟。 Gromacs现在支持粒子分解和域分解算法。默认情况下,Gromacs模拟使用域分解,尽管直到最近,多年以来,粒子分解是Gromacs中唯一实现的方法。在Gromacs的一篇论文(DOI 10.1002 / jcc.20291)中,作者给出了最初选择粒子分解的原因: “早期的设计决策是选择使用粒子分解而不是域分解来将工作分配到处理器上。在后一种情况下,将空间域分配给处理器,这使得仅通过本地通信即可快速找到空间邻居,但是会带来复杂性对于跨越空间边界的粒子而言,域分解是一个更好的选择,只有当线性系统的大小大大超出相互作用范围时,分子动力学中才很少发生这种情况,通过粒子分解,每个处理器都可以计算力和坐标/速度更新对于预先分配的粒子,使用预先计算的邻居列表均匀分布在处理器上。F我 ĴF一世ĴF_{ij}从颗粒之间的一对相互作用产生一世一世i 和ĴĴj,这是需要两种粒子的速度更新和 一世一世iĴĴj,仅计算一次,并传达给其他处理器。每个处理器将系统的完整坐标集保留在其本地内存中,而不是将存储限制在所需的坐标范围内。这更简单并节省了通信开销,而内存要求通常根本不是限制因素,即使对于数百万个粒子也是如此。另一方面,可以包含多达1000倍粒子数量的邻居列表分布在处理器上。基本上,通信仅限于围绕处理器环的每个时间步发送一次坐标和力。这些选择随着时间的推移被证明是可靠的,并且很容易适用于现代处理器集群。” 句子“仅当线性系统的大小大大超过相互作用范围时,才是域选择是一个更好的选择,这在分子动力学中很少见”,它们是什么意思?从上面的段落中,我得到一种想法,即粒子分解的优点是不必处理跨域边界移动的粒子。相反,您只需要为每个处理器有足够的内存来存储整个系统配置即可。因此,粒子分解看起来非常有利,而域分解看起来非常不利。 我确信这是一个非常复杂的问题(可能是许多书籍的主题),但是基本上,如果粒子分解看起来如此有利,为什么有人需要使用域分解? 如果系统规模很大(使每个处理器都难以或不可能存储整个配置),则域分解是否有利?基于上面引用的段落,我不确定为什么最近刚将域分解作为Gromacs中的默认并行化算法。 似乎现在的DL_POLY(版本4)也使用域分解。从版本4手册中: “以这种方式对配置数据进行划分是基于原子在模拟单元中的位置,系统数据的这种几何分配是DD算法的特点。请注意,为了使该策略有效地起作用,系统必须具有合理均匀的密度,以便为每个处理器分配几乎相等的原子数据部分(尽可能多),通过这种方法,在处理器和该方法在概念上很简单,尽管编程很麻烦,但在概念上却很简单,特别适合效率最高的大规模仿真。 ... 在使用DD策略的情况下,SHAKE(RATTLE)算法比DL_POLY Classic的“复制数据”方法更简单,后者需要原子位置的全局更新(合并和剪接)。” 这听起来好像域分解是好的,因为它可能更有效,即使可能更难以实现。 另一方面,以前的版本(DL_POLY Classic)使用了复制数据并行化,这似乎是粒子分解的另一个名称。从该版本的手册中: 复制数据(RD)策略是在MD中实现并行化的几种方法之一。从配置数据的并行计算机中的每个节点(在复制其名称导出即阵列限定的原子坐标,速度 ,和力,对于全部[R一世[R一世\textbf{r}_iv一世v一世\textbf{v}_iF一世F一世\textbf{f}_iññN在模拟系统中的每个原子都在每个处理节点上重现。在这种策略中,大多数力的计算和运动方程的积分可以在节点之间轻松而平等地共享,并且在很大程度上可以在每个节点上独立进行处理。该方法编程相对简单并且相当有效。而且,它很容易在单个处理器上“崩溃”运行。但是,该策略在内存中可能很昂贵,并且具有较高的通信开销,但总的来说,它已被证明在各种应用程序中都是成功的。 该段似乎与该问题的第一段基本一致,不同之处在于它说复制的数据/粒子分解具有“高通信开销”。Gromacs论文的段落似乎相反-粒子分解是更可取的,因为它比域分解具有较低的通信开销。 你有什么想法吗?

3
为什么矩阵向量乘法缩放没有缩放?
抱歉,很长的帖子,但我想一开始就包括我认为相关的所有内容。 我想要的是 我正在实现用于稠密矩阵的Krylov子空间方法的并行版本。主要是GMRES,QMR和CG。我(剖析后)意识到我的DGEMV例程是可悲的。因此,我决定通过隔离来集中精力解决这一问题。我尝试在12核计算机上运行它,但以下结果是4核Intel i3笔记本电脑的结果。趋势差异不大。 我的KMP_AFFINITY=VERBOSE输出在这里。 我写了一个小代码: size_N = 15000 A = randomly_generated_dense_matrix(size_N,size_N); %Condition Number is not bad b = randomly_generated_dense_vector(size_N); for it=1:n_times %n_times I kept at 50 x = Matrix_Vector_Multi(A,b); end 我相信这可以模拟CG进行50次迭代的行为。 我尝试过的 翻译 我最初是用Fortran编写代码的。我将其翻译为C,MATLAB和Python(Numpy)。不用说,MATLAB和Python太可怕了。令人惊讶的是,对于上述值,C比FORTRAN好一到两秒。一致。 剖析 我分析了要运行的代码,并且运行了46.075几秒钟。这是将MKL_DYNAMIC设置为FALSE并且使用了所有内核的时候。如果我将MKL_DYNAMIC设置为true,则在任何给定时间点仅使用(大约)一半数量的内核。以下是一些详细信息: Address Line Assembly CPU Time 0x5cb51c mulpd %xmm9, %xmm14 36.591s 最耗时的过程似乎是: Call Stack …

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.