我应该使用哪些C++库来进行大规模并行计算、数字计算项目并利用第三方应用程序?

2024-04-16 17:37:55 发布

您现在位置:Python中文网/ 问答频道 /正文

简介

我想就一个新的编程项目征求很多建议,我将自己开始。我将非常精确地说明我想要完成什么,以及我的基本要求是什么。因此,这将是一个长期的问题。请容忍我。在

我将把问题分成五个部分:

  1. 现实世界问题
  2. 模拟问题
  3. 要求和偏好
  4. 附加信息
  5. 建议请求列表

1。现实世界问题

摩天大楼和大型桥梁承受着动态风荷载。这意味着,如果设计不当,它们可能会因风振而倒塌(这实际上发生在1940年:http://www.youtube.com/watch?v=3mclp9QmCGs)。为了正确设计这种结构,需要高效的数字运算软件进行分析和仿真。在

2。模拟问题

有许多软件可以模拟流体流动或结构力学。其中许多已经开发了30多年,是成熟的成熟技术。因此,编写一个能够从头开始同时模拟流体流动和结构力学的多物理程序是不明智的。首先,你需要多年的开发才能成熟,而进入一个依赖特定软件超过30年的世界是非常困难的。但更重要的是…当你可以重用时,为什么要重新创建?我不追求单一的方法,而是喜欢分区的方法,这样可以重用现有的仿真软件。在

在分区方法中,我将使用软件X来模拟流,我将使用软件Y来模拟结构。然后我将编写我自己的耦合算法,在X和Y之间建立通信,并用它们来模拟多物理问题(例如摩天大楼或桥梁的风振)。我之所以使用X和Y而不是实际的软件名是因为X和Y应该是黑盒。我的耦合算法决不依赖于X和Y的实现。算法只依赖于X和Y的输出。这样,最终用户可以选择哪个X或Y对他们可用,或者哪个X或Y能够做最终用户想要实现的事情。在

因为我想使用黑盒分区的方法,软件X对Y一无所知,反之亦然。但是我如何在不知道周围空气流动的情况下模拟桥梁的变形,如何知道周围的空气流动是以何种方式受到结构的扰动而不知道它的变形呢?答案很简单:从猜测开始,使用迭代方法收敛到正确的解。然而,这种方法在计算上非常昂贵。为了降低计算成本,可以使用非常有效的技术以一种巧妙的方式编写耦合算法,这里不再讨论。我想说的是,一些沉重的线性代数数字运算是必要的。在

3。要求和偏好

我需要做的是:

  • 在第三方开源软件或专有软件之间建立通信
  • 执行一些繁重的数字运算(线性代数)
  • 可视化结果(2D/3D绘图和动画)
  • 提供交互式分析和开发环境
  • 创建直观的图形用户界面

我希望我的软件是:

  • 开源
  • 跨平台
  • 可通过脚本和/或共享库进行扩展

我要用的是:

    C++用于重数压缩< /LI>
  • 用于编程逻辑的CPython
  • 在CPython中进行数字运算的NumPy/SciPy
  • CPython中结果可视化的Matplotlib

4。附加信息

事实:

  • 一个人的项目开始,如果成功的话成长为公司
  • 主操作系统是基于KDE的Linux发行版

商业模式:

  • 免费软件和基本文档。在
  • 付费服务和详细的文档。在

5。建议请求列表

我想通过编写许多单独执行一个微小任务的函数来完成C++中的所有数字压缩。程序逻辑包含在一个CPython程序包中,它执行整个模拟,同时依赖C++函数来执行数字压缩。将C++和CPython算法扩展到用Cpththon编写的脚本(使用NoMPY、SciPy、Simuly和Matplotlib)生成和可视化原始数字数据的结果。我想能够做并行计算,我需要与几个第三方的开源和专有软件通信。在

为了完成所有这些,我需要一大堆现有的库/包/技术等等。对于所有相关的问题,我知道我可以使用什么,但是我不知道我应该使用什么。最好的解决办法是一如既往地尝试一切,看看什么最有效。但是,如果任何有经验的用户可以排除一些不太可能的候选人,我很乐意收到他或她的建议,建议,赞成/反对的名单:

  1. 粘接C++和CPython(如cType、SIP、SWIG等)
  2. C++线性代数数列库(如犰狳、本征、PETSc etc.)< /LI>
  3. 图形界面开发库(例如Qt、GTK、wxWidgets等)
  4. 软件通信和并行计算(如MPICH、OpenMPI、OpenMP等)
  5. CPython 2.7.x或CPython 3.x

注:我总结了以上的一些选项,但这些只是示范性的,而不是限制。我对所有事物都开放,只要它是用C、C++、FORTRAN或Python编写的。同时,我也不期望在以上五个类别中都能从一个人那里得到答案。让社区的集体知识来解决这个问题。在

我感谢所有的贡献者,并祝你们在自己的努力中一切顺利。在


Tags: 项目方法算法软件可视化编程世界开源
3条回答

图形界面开发库(例如Qt、GTK、wxWidgets等)
如果您的“主操作系统是一个基于KDE的Linux发行版”,那么QT将轻而易举地赢得这一发行版。
背后的逻辑这个:-

  • KDE写在QT中。一个运行在KDE中的QT应用程序是空中的老鹰!它在它的元素里。由于KDE是第一目标,QT-GUI很可能是开箱即用的,用户无需下载额外的GUI库。您的图形用户界面也将看起来超级原生。
  • 三个QT是最便携的。(你提到了“主操作系统”,暗示其他平台可能也会紧随其后)。因此,使用qt,您可以移植到Windows、OSX、GNOME、嵌入式Linux、Android、Symbian、俳句、Solaris等
  • QT拥有三大跨平台guilibs(IMHO)中最好的RAD工具。想想QTCreator vs wxSmith vs Anjuta/Glade。
  • 基本上,wv3是wv3+上的附加widgets。我会把它放在GTK上。它也环绕着X11和motif,但相信我,头儿,你不会喜欢这些端口的。
  • wxWidgets的可移植性并不像人们想象的那样无缝。每个端口都是一个完全不同的实现,每个端口包装着完全不同的后端!我曾经移植了一个小应用程序,它使用wxDataViewCtrl和一个定制的树模型。西格塞格夫斯成了当时的风尚。所以我最终决定使用通用的wxDataViewCtrl(在GTK+3中看起来很有趣)。我仍然喜欢wxWidgets。在

NB:还可以考虑在MVC(model view controller)的C&V部分使用最新的web技术。
HTML5+CSS3+JS可以通过桌面应用程序上的web视图小部件运行。以上3个guilib都使用这个控件(对于wx,它是wx2.9.3及更高版本)。
网络技术技术:在

  • 拥有(可以说)任何GUI库中上市时间最快的。在
  • 拥有(可以说)当今任何GUI技术中可用性最高、价格最实惠的开发人员。在
  • 生成任何GUI库中最出色的ui。在
  • 生成任何GUI库中最不“僵化”的ui……你可以用鼠标移动一个GUI元素,比如一个html表格,在任何轴上旋转一个精美的动画,而不需要任何编程开销!。。没有js..没有c++..不可能!在

CPython 2.7.x或CPython 3.x
-CPython可能不太适合您的项目需求(我认为),主要是因为互斥体是全局解释器锁(GIL)的瓶颈。
也许PyPy对于您的项目来说是一个更好的python实现?

顺便问一下,你有没有建议:-Javascript在V8和Python上(pypyy,CPython等)?Javascript run by V8 can interact with Native Code (c++)有点像python

我还遇到了这个interesting blog(V8上的JS vs Py)。在

可能,gmp。您可以在此处找到更多详细信息:http://gmplib.org/

你提到了并行性,但没有提到如何使这个项目并行。这比简单地选择几个库要复杂得多。在向前迈进之前,需要考虑几个主要因素。在

您简要地提到了预期的平台,但是您还必须考虑模拟是在单个计算机/节点上运行还是在多个计算机/节点上运行。考虑到您正在对建筑进行迭代模拟,您可能需要比任何一台计算机所能提供的计算能力多得多的计算能力。这意味着,除非您希望使用混合的多进程、多线程方法,否则只能使用并行的多进程模型。OpenCL和MPI是实现的每个选项。(注意:MPICH和OpenMPI都只是MPI的实现,您的代码应该与这些无关)使用MPI传递消息是一个很好的并行性通用模型,但是对于那些不习惯于使用并行代码的人来说,这可能会非常困难。我个人的经验是使用MPI和一些混合编程,所以对于您选择的并行模型,我不能说太多。在

并行模型问题带来的一个问题是它直接影响到仿真软件。我不完全确定你计划如何将你的算法与模拟分开。如果您计划让您的代码分叉单独的进程来运行模拟,您将面临跨平台支持的问题,因为您可能无法以这种方式运行任意模拟。如果您打算在软件中运行仿真,则并行模型必须始终保持一致。尽管这会限制黑盒策略,但它可能会使整个过程更加可行。在

关于适用的库,已经有很多人说过了。我没有更多的话要说那些还没有被提及的特定库。请记住,在运行模拟时,许多相同的问题都必须通过这些解决。在

TLDR:不应该检查并行性。在对库做出决策之前,您需要知道将使用哪个并行模型。在

相关问题 更多 >