【问题标题】:(Re)Starting with C++ (for scientific computing)(重新)从 C++ 开始(用于科学计算)
【发布时间】:2011-05-15 22:47:09
【问题描述】:

我精通各种语言的编程。我一直在使用 MATLAB 实现我的研究代码(在过去的几个月里),并且第一次真正注意到 MATLAB v$ C 的执行速度的差异。(尽管我非常喜欢快速原型制作能力)。

我正在寻找 C++ 并开始在我的研究中使用它。我知道 OOP 并且已经编写了相当多的 Java(相对较长的回溯)和 C++(甚至更长的回溯)。我现在想真正深入了解 C++,因此需要有关资源的建议:

  • 我需要掌握哪些 C++ 知识(STL 和。)才能真正充分利用 C++?
  • 什么是好的入门教程/手册?
  • C++ 的数值/科学库有哪些? GSL?是否有 Scipy/Numpy for C++ 的等效(功能)?

我将在 Linux 上编程,所以我将使用 g++。

任何指向以前的 SO 问题的指针也很感激。

【问题讨论】:

  • 如果你描述了你将使用什么样的算法和数据结构,你可能会得到更好的答案。它只是数字还是你也在做符号计算?你在做线性代数、FFT、小波等吗?

标签: c++ scientific-computing


【解决方案1】:

TRNG 是一个并行随机数生成库。它允许您创建多个独立的流,并且专为在集群上使用而设计。

【讨论】:

  • 这并没有添加任何有用的东西。
【解决方案2】:

在图书馆方面,请查看Armadillo。它almost gives you the full extent of MATLAB's array manipulation syntax 并在后台使用 LAPACK 和 BLAS (ATLAS)。

【讨论】:

  • 还建议使用MLPACK library,这是一个建立在Armadillo之上的快速机器学习库(分类、回归、聚类等)
【解决方案3】:

本教程绝对精彩,但您可能不想一开始就解决它。

http://www.parashift.com/c++-faq/

请务必阅读 STL(标准模板库)和其他内容,使用以下网站:

http://cplusplus.com/

还有,查看 Boost 库:

http://www.boost.org/

要真正充分利用 C++,您至少需要学习 STL,仅此一项就可以为您节省大量时间,但正如 parashift 所提到的,如果您不使用动态绑定,C++ OOP 只能使用对象进行编程.

【讨论】:

  • 您听起来好像“仅使用对象编程”(或函数、模板等)有问题。动态绑定的实用性由需要确定运行类型的输入的类型/类来指示 - 在许多领域中,这种异常多于标准。
  • 我并不是说只使用对象有什么问题。我只是说当你拥有一组基类指针等时,真正的力量开始发挥作用。这是我所指的部分(我认为,只是看了一眼),但它解释了为什么虚拟/动态绑定如此重要:parashift.com/c++-faq/virtual-functions.html 但不,我并不是要暗示这很糟糕。
  • 有趣的观点...在我看来 - 当您可以使用编译时多态性(或不需要任何)并且运行时多态性是最好的时,C++ 的“真正”力量就会发挥作用(通常)处于尴尬的境地(这总是受欢迎的,但并不令人兴奋)。无论如何...不用担心:-)。
【解决方案4】:

您需要尽快掌握并行编程。对于消息传递,我喜欢Karniadakis and Kirby 的这本书。在有关 OpenMP 的书籍中,对于分布式内存编程,this one 是最好的。

如果您可以访问它们,那么英特尔的线程构建模块、数学内核库和集成性能原语是不错的选择。如果没有,有很多开源替代品,开始查看Netlib

哦,我差点忘了BOOST,这是必须的。

【讨论】:

  • 他刚刚开始接触 C++。您的方法将使他在开始创建竞争条件之前永远无法解决他的内存泄漏。
  • @xscott:可能是这样,但如果有人担心高性能科学计算,很快他们将需要实际使用机器上的所有内核,而不是运行以 50% 或 25% 的速度。不过,fork() 可能值得在线程之前尝试一下。
  • 马克是对的——最好在一开始就加入并行性。如果他等待,正如@Josh 建议的那样,在开始并行之前定期使用动态绑定,他将在他的 32 核笔记本电脑上编写非常复杂、“强大”的串行代码。 @Amit,我同意 BOOST、STL、K&K、OpenMP 的建议。虽然对英特尔的 TBB 和 IPP 持谨慎乐观的态度,但我不会编写任何我想在 7 年后与它们中的任何一个一起工作的代码。最重要的是,请记住,它是以可扩展、可维护的方式解决您的问题。其他任何事情都是一种爱好。
  • @Jonathan Dursi:你说得比我好。 @xscott 似乎错过了 @Amit 解释说他对 C++ 并不陌生,但 @Amit 也是如此。
  • @xscott +1 但这在 C++ 中是不可避免的。
【解决方案5】:

关于像 Numpy 这样的数字,你应该看看两者:

闪电战++http://www.oonumerics.org/blitz/

贾马/TNT http://math.nist.gov/tnt/download.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多