正確的C 並行

2021-06-28 09:02:06 字數 1840 閱讀 8115

《c++0x漫談》系列之:多執行緒記憶體模型 (簡稱為漫談)解釋了多執行緒並行的困難,在這裡我分層地看看這個問題。

1.為什麼分層次?

c++語言表達的抽象和機器的抽象距離比較近,而且幾乎看不到c++在虛擬機器上跑的例項,所以兩者的關係容易混淆。有人常常把反彙編拿出來一看,並作為c++語言是如此的證據,這是本末倒置的。假定c++都是直接翻譯為彙編,於是這只是乙個如何將乙個語言翻譯為另外乙個語言的問題。編譯器幹的事就是用目標語言的一些抽象來實現源語言一些抽象,所以目標語言的語義,行為,並不能決定源語言,而只能說明翻譯的正確性和質量。比如,某個c++類在語義上有個建構函式的呼叫,但是其行為是平凡的,在翻譯後的**中看不到任何構造函式呼叫的**,這並不是建構函式不存在的證據。所以,這裡我們分出層次,一方面是彙編及其實現(即cpu)的結合體,另一方面就是c++了。

2.怎麼翻譯?

顯然,翻譯建立在對兩種語言上的充分理解上。理解乙個語言,就要理解其提供的抽象及其語義。如何定義語義?這是研究程式語言的人幹的,比較經典的有操作語義,指稱語義。在這裡我們不嚴格地從操作語義的角度來看這兩種語言。

根據維基的描述:乙個計算機語言的操作語義描述一段合理的程式是怎樣被理解為一系列計算機步驟的。這些步驟就是這個程式的意義。

2.1[組合語言的語義]如果不考慮較高層次的彙編(比如巨集彙編)因為其中新增了一些東西,使得更抽象。只考慮一些常見的指令,由於彙編本身就描述了一些操作步驟,在操作過程中對環境進行改變,從乙個狀態轉換到另乙個狀態,所以其操作語義和語言沒什麼大的間隙。如果考慮多個核在同乙個環境下執行**,intel(這裡只談x86)也定義了其memory order,其中展示了一些並行執行的彙編**,並說明什麼樣的結果是可能的,什麼樣的結果是不可能的,以一種晦澀的方式說明了多個執行單元同時執行時執行環境的狀態變化情況,換句話說,定義了語義。

此時,翻譯的正確性就變成了執行環境的對等性和操作的對等性。比如c++中有乙個物件,由乙個32位整數,乙個double浮點數描述其狀態,執行環境的對等性就意味著:在彙編的執行環境中使用12個位元組或16個位元組(考慮對齊)來表示這個物件。c++中這個物件上的狀態變化,對應於彙編中對這些位元組的操作。比如在c++中有64位整數,(假定)彙編中只有32位整數,執行環境的對等性意味著:在彙編的執行環境中使用兩個32位整數來表示這個64位整數。c++中定義64位整數加法操作,在彙編中用若干條指令完成64位整數的運算。

3.如何保證無並行語義的語言在並行執行的時候的正確性?

《漫談》一文中已講。其中提到的「乙個簡單的辦法就是禁止編譯器作任何優化:所有的操作嚴格按照**順序執行,所有的操作都觸發cache coherence操作以確保它們的***在跨執行緒間的visibility順序。」我認為並不是簡單禁止編譯器作任何優化就能達到後面的效果,甚至需要編譯器做更多的事。這些做的更多的事,相當於對源語言有所擴充套件:出現了並行的苗頭。而後面提到的「data-race-free」使得在保證正確性的同時,提高效率,其實相當於我們面向的是編譯器擴充套件的乙個有並行語義的語言(當同步原語是編譯器提供的時候認為是編譯器擴充套件語言,當同步原語是庫提供的時候,認為是庫擴充套件了語義,同時編譯器必須理解庫所提供的語義,否則在呼叫庫**的地方給個優化就完蛋了)。如何實現庫呢?面向執行環境程式設計。要麼庫直接用執行環境的語言寫,要麼通過插入執行環境的**(內聯彙編),並行在插入**處編譯器不作優化。

上述正確性考慮得比較理論,如果從實際上講呢?

a假定優化不會跨函式呼叫。這一方面使得庫的**被保護,另一方面保證了呼叫處的正確性。

b面向執行環境程式設計,通過內聯彙編來保證並行語義。

c假定優化不跨內聯彙編。

上述假定較容易實現,在實現後我們得到了依賴於庫的提供了並行語義的語言。

4.如果源語言有並行語義呢?

定義了c++11中的mutex,atom的語義後,翻譯時編譯器知道某些操作的順序不能改變,在適當的地方應該加入mb。

c 並行程式設計

本部落格將看c 並行程式設計的例子 1.執行緒程序原理 執行緒是輕量級的程序,乙個程序可以擁有多個執行緒。編譯多執行緒程式加入 g lphread 2.openmp庫加速 2.1 openmp庫加速配置及hello,world 事實上有個openmp庫,可以實現單台cpu的加速 windows下使用...

c 並行程式設計 平行計算筆記 001

平行計算筆記 001 安裝mpi,openmp動力 需要用高效能計算求解微分方程,這也將是我這接下來三年的學習方向之一。目前以mpi為主,將來肯定會涉及到異構計算。希望寫這些筆記記錄我的修煉歷程。目前的學習目標及就是掌握將偏微分方程組的差分形式稠密化。對將來的看法 主要的方向是平行計算的程式開發。希...

C 之並行開發

並行開發 加速遊戲 處理器製造商有用他們的cpu在每秒。這看起來是模型cpu在桌面電腦,台式以及手機,cpu將要超過2.5ghz。cpu將要有yue來yue多的表現。在本章我們將要展示如何創造乙個執行緒來執行這個方法game rungame.這將要意味著主要的遊戲迴圈將要執行在它自己本身的執行執行緒...