jjzjj

c++ - 我应该将哪个C++库用于利用第三方应用程序的大型并行计算数字处理项目

coder 2024-02-05 原文

简介

我想在一个新的编程项目上寻求很多建议,我将自己开始。我将非常精确地完成我想完成的工作以及我的基本要求。因此,这将是一个漫长的问题。请多多包涵。

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

  • 实际问题
  • 模拟问题
  • 要求和首选项
  • 附加信息
  • 建议请求列表

  • 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++用于大量运算
  • 用于编程逻辑的CPython
  • NumPy/SciPy在CPython中进行一些数字运算
  • Matplotlib,用于在CPython中可视化结果

  • 4.附加信息

    事实:
  • 一个人的项目开始时,如果
  • 成功,则发展为公司
  • 主操作系统是基于KDE的Linux发行版

  • 商业模式:
  • 免费软件和基本文档。
  • 付费服务和详尽的文档。

  • 5.建议请求列表

    我想通过编写许多单独执行微小任务的函数来完成C++中的所有数字运算。程序逻辑将包含在CPython程序包中,该程序包执行整个模拟,同时依赖C++函数执行数字运算。 C++/CPython算法将使用用CPython编写的脚本(使用NumPy,SciPy,SymPy和Matplotlib)进行扩展,以从原始数值数据生成和可视化结果。我希望能够进行并行计算,并且需要与多个第三方开源和专有软件进行通信。

    要完成所有这些工作,我将需要一大堆现有的库/程序包/技术等。对于所有相关问题,我知道我可以使用什么,但是我不知道我应该使用什么。最好的解决方案是一如既往地尝试一切,看看最有效的方法。但是,如果有经验的用户可以淘汰一些不太可能的候选人,我很乐意在以下方面收到他或她的建议,建议,赞成/反对名单:
  • 粘合C++和CPython(例如CType,SIP,SWIG等)
  • C++线性代数数字运算库(例如Armadillo,Eigen,PETSc等)
  • 图形界面开发库(例如Qt,GTK,wxWidgets等)
  • 软件通信和并行计算(例如MPICH,OpenMPI,OpenMP等)
  • CPython 2.7.x或CPython 3.x

  • 注意:我已经总结了上面的一些选项,但是这些仅是示例性的,而不是限制。只要它是用C,C++,Fortran或Python编写的,我都会接受所有内容。我也不希望上面列出的所有五个类别中的任何一个答案。让社区的集体知识来照顾这一点。

    我感谢所有贡献者,并祝您一切顺利。

    最佳答案

    您提到的是并行性,但没有提到如何使该项目并行。这比选择几个库要复杂得多。前进之前,需要考虑几个主要注意事项。

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

    并行模型问题产生的一个问题是,它直接影响了仿真软件。我不能完全确定您打算如何从模拟中分离算法。如果您打算让代码 fork ​​的单独过程来运行仿真,则跨平台支持会遇到问题,因为您可能无法以这种方式运行任意仿真。如果您打算在软件中运行仿真,则并行模型必须始终保持一致。尽管这给黑匣子策略带来了限制,但它可能使整个事情变得更加可行。

    关于适用的库,已经有很多论述。对于没有说过的特定库,我没有更多要说的。请记住,与运行模拟时一样,必须解决许多相同的问题。

    TLDR:不应忽视并行性。在对库进行决策之前,您需要知道将使用哪种并行模型。

    关于c++ - 我应该将哪个C++库用于利用第三方应用程序的大型并行计算数字处理项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16628441/

    有关c++ - 我应该将哪个C++库用于利用第三方应用程序的大型并行计算数字处理项目的更多相关文章

    1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

      我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

    2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

      如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

    3. ruby - 如何指定 Rack 处理程序 - 2

      Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

    4. ruby - 在 Ruby 中编写命令行实用程序 - 2

      我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

    5. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

      为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

    6. ruby-on-rails - Rails 应用程序之间的通信 - 2

      我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

    7. ruby - 无法运行 Rails 2.x 应用程序 - 2

      我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

    8. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

      我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

    9. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

      刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

    10. ruby-on-rails - 使用一系列等级计算字母等级 - 2

      这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

    随机推荐