重新开始学习C++(用于科学计算)

16

我对各种编程语言有一定的掌握。最近几个月,我一直在使用MATLAB为研究实施我的代码,并且第一次真正注意到MATLAB与C执行速度的差异(尽管我喜欢其极快的原型制作能力)。

我希望学习C++并开始在我的研究中使用它。我了解面向对象编程(OOP),并且已经在Java(相对较早)和C++(更早些时候)中进行了不少编程。我现在想深入学习C++,因此需要有关这方面资源的建议:

  • 我需要学习哪些C++知识(STL等),才能充分利用C++?
  • 有什么好的教程/手册可以入门?
  • 有哪些C++数值/科学库? GSL? 是否有与Scipy/Numpy功能等效的C++库?

我将在Linux上编程,因此我将使用g++。

非常感谢任何以前SO问题的指针。


如果您描述您将使用哪些算法和数据结构,您可能会得到更好的答案。您只是处理数字还是进行符号计算?您是否进行线性代数、FFT、小波等操作? - J D
5个回答

7

你需要尽快掌握并行编程。对于消息传递,我喜欢Karniadakis和Kirby所著的这本书:链接。关于OpenMP的书籍,对于分布式内存编程,这本是最好的。

如果你能够获取到它们,那么英特尔的线程构建模块、数学核心库和集成性能原语都是不错的选择。如果没有,那么有很多开源替代品可供选择,可以从Netlib开始寻找。

哦,我差点忘了必备的BOOST


7
他刚开始学习C++。你的方法会让他在开始创建竞态条件之前就永远无法解决内存泄漏问题。 - xscott
@xscott:这可能是对的,但如果有人担心高性能科学计算,很快他们将需要实际使用机器上的所有核心,而不是以50%或25%的速度运行。在尝试线程之前,fork()可能值得一试。 - Steve Jessop
1
Mark是对的 - 最好在一开始就实现并行。如果他像@Josh建议的那样等待,要在开始并行之前定期使用动态绑定,那么他将在32核笔记本电脑上编写非常复杂、强大的串行代码。@Amit,我同意使用BOOST、STL、K&K、OpenMP的建议。虽然我对英特尔的TBB和IPP持谨慎乐观态度,但我不会立即使用它们编写任何未来7年内需要工作的代码。最重要的是,记住这是以可扩展、可维护的方式解决问题。其他任何事情都是一种爱好。 - Jonathan Dursi
@Jonathan Dursi:你的表述比我好。@xscott似乎错过了@Amit解释他不是C++新手的那一部分,但是@Amit也是这样。 - High Performance Mark
@xscott +1 但这在C++中是不可避免的。 - J D

5

4

还建议使用MLPACK库,它是一个快速的机器学习库(分类、回归、聚类等),构建在Armadillo之上。 - mtall

2
这个教程非常棒,但你可能不想一开始就尝试它。

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

请确保阅读STL(标准模板库)和其他相关内容,可以使用以下网站:

http://cplusplus.com/

"还有,看看Boost库:"

http://www.boost.org/

要充分利用C ++,您至少需要学习STL,仅这一点就可以节省大量时间,但正如parashift所提到的那样,如果您不使用动态绑定,则C ++ OOP只是对象编程。

你让“仅使用对象编程”(或函数、模板等)听起来好像有什么问题一样。动态绑定的实用性是由于需要在运行时确定输入的类型/类别而指示的——在许多领域中,这更多是例外而不是规则。 - Tony Delroy
我并不是说只使用对象有什么问题。我只是在说当你拥有一组基类指针等时,真正的力量就会发挥出来。这是我所提到的部分(我想是这个,只是随便看了一眼),但它详细解释了为什么虚拟/动态绑定如此重要:http://www.parashift.com/c++-faq/virtual-functions.html 但不,我并不是在暗示它不好。 - Josh
1
有趣的观点...对我来说,C++的“真正”威力在于当你可以使用编译时多态性(或者不需要任何多态性)时,而运行时多态性在尴尬情况下通常只是最好的选择(虽然始终受欢迎,但并不令人兴奋)。无论如何...别担心 :-)。 - Tony Delroy

-2

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


这没有添加任何有用的东西。 - High Performance Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接