你有什麼關於Linux下C++並行編程的好書和經驗跟大家分享?

小弟最近想學習在Linux下寫C++的並行處理,請問大家有什麼好的入門書籍和寶貴的經驗和我跟我分享下。


C++ Concurrency in Action by Anthony Williams

這本主要介紹C++11標準庫的並行特性,不錯的多線程編程入門

An Introduction to Parallel Programming

敝校高性能計算導論課的教材,講MPI/pthreads/OpenMP;MPI很老但還是值得一學,可以看作分散式計算的彙編語言

High Performance Parallelism Pearls, 1st Edition

Cookbook式的書,一章講一個問題/技巧。適合進階者;也有講到前兩本沒講的GPGPU;去年11月新出,我正準備看

以上幾本書不僅限於Linux。。Win下也很容易搭環境練習

Intel Education Offerings

Linux下非商業用途可以免費用Intel的C++工具鏈


推薦一本書叫

Is Parallel Programming Hard, And, If So, What Can You Do
About It?


上周在用pthreads的時候,看到過一篇:

Introduction to Parallel Computing

此外,最近在看ZeroMQ(Code Connected),感覺蠻有意思的。答主有時間可以看一下。zguide(http://zguide.zeromq.org/page:all)中有這麼一段話,可以參考一下:

If you"ve spent years learning tricks to make your MT code work at all, let alone rapidly, with locks and semaphores and critical sections, you will be disgusted when you realize it was all for nothing. If there"s one lesson we"ve learned from 30+ years of concurrent programming, it is: just don"t share state. It"s like two drunkards trying to share a beer. It doesn"t matter if they"re good buddies. Sooner or later, they"re going to get into a fight. And the more drunkards you add to the table, the more they fight each other over the beer. The tragic majority of MT applications look like drunken bar fights.

當然,上面這一切都不是重點!我就佔個座看大嬸們怎麼說的。

-----------


當時在玩Raspberry Pi的時候,被這張圖震驚了,64個Pi用Lego玩具,組了一個超級計算機。

這就是並行計算,自己動手比較生動,可以搞兩個,主要也是用了MPI的庫。

參考:

http://www.southampton.ac.uk/~sjc/raspberrypi/pi_supercomputer_southampton_web.pdf


入門,這裡先給你做點科普,linux下高性能並行計算。做進程級別的並行,可以試著做MPI或hadoop方面;。做線程級別的並行,可以考慮OpenMP,在設備允許條件下可以用CUDA。如果條件可以再好,可以用眾核計算。入門後,可以試著做異構並行計算,如CPU+GPU。做科研方面的並行計算,要獲取更大的計算資源的話,可以向國防科大的天河一號機器申請機時。


用哪種工具並行? CUDA? MPI?

用CUDA的話可以參考《CUDA by example. An introduction to general-purpose GPU programming》

用MPI的話可以參考《高性能計算之並行編程技術---MPI程序設計》

-----------------------------分割線------------------------------

https://computing.llnl.gov/?set=trainingpage=index#workshops

LLNL主辦的一個關於高性能計算的workshop,openmp, mpi, CUDA都有涉及,還介紹了些並行程序的調試工具等,方便快速入門。


Linux環境的話,可以用MPI+OpenMP.

MPI是進程級別的並行處理,即多進程。

有專門的程序介面,進行進程的開啟,進程之間數據消息的發送與接收,進程的關閉等。需要了解程序介面的用法。

OpenMP是線程級別的並行處理,即多線程。

相對比較簡單,非多線程程序能夠通過簡單的處理,實現並行處理。但需要了解線程的一些特點,比如共享存儲空間,競爭的處理等。

可以用MPI+OpenMP結合的方式進行並行處理,即開啟多個進程,並在進程中運用多線程。

用MPI和OpenMP進行並行計算,編程方面比較簡單。重要的是對需要處理的業務的分析,是否能夠並行處理?進程並行還是線程並行?還是結合使用?這些都是需要仔細考慮的。

在進程級別的並行處理時,要考慮數據並行還是計算並行,或者都要。

數據並行,就是不同進程處理不同數據,如果是一整塊數據,就需要對數據進行分塊。

計算並行,就是將不同的計算過程並行處理。

兩者可以結合使用。

總之,MPI和OpenMP編程簡單,重要的是按照具體業務,設計並行處理邏輯。


自行Google「OpenMP」,誰用誰知道。


Structured Parallel Programming - Patterns for Efficient Computation.

不推薦OpenMP


C++並發編程實戰, Anthony Williams, 中英文pdf全本:

英文原著https://pan.baidu.com/s/1qYp2NRe [6.4M],

中文目錄https://pan.baidu.com/s/1eRBlGK6 [2.1M],

中文正文https://pan.baidu.com/s/1i5vgQpR [80M] .


這個太多了,不過基本可以分為兩大類吧,基於CPU的和基於異構的。先說基於cpu的,這個用的最多,有很多常見的庫,比如 openmp,openmpi,pthread,tbb等,基於異構平台的,比如 opengl,cuda等,根據需要吧。若專註於cpp的,以上都可以,但是 自cpp11以來標準庫中納入了並發並行計算部分,可以採用,在者 boost 庫 也有這部分內容的,根據你的需要選擇吧。

ps opengl和cuda相對比較複雜一些。


c++ amp 跨平台的gpu加速庫


Programming Massively Parallel Processors, 2nd Edition

By: David B. Kirk; Wen-mei W. Hwu


《並行程序設計導論》 原版書「An Introduction to Parallel Programing」,by Peter S. Pacheco, 機械工業出版社

這個是我們高性能計算課的教材。


推薦閱讀:

為什麼 C++ 中,基類指針可以指向派生類對象?
在取消同步的情況下,為什麼cin的速度比scanf快?
GCC編譯的程序為什麼沒有正確調用拷貝構造函數?
C++ 程序員有必要熟練使用除標準庫以外的第三方庫嗎?

TAG:演算法 | 並行編程 | C | CC | Linux開發 |