C 在高效能計算領域為什麼效能卻如此不盡人意

2022-01-16 01:32:50 字數 1047 閱讀 2929

c#的優雅,強大ide的支援,.net下各語言的二進位制相容,自從第一眼看到c#就被其良好的設計吸引。一直希望將其應用於高效能計算領域,長時間努力卻效果卻不盡如人意。

對於小的測試**用例而言,c#用20-30%的效能損耗換取良好的開發維護體驗倒是非常值得。

但fem/cfd/sph求解器的實際開發中,作為典型的運算密集型專案,對效能極其敏感。即使是單執行緒,未作充分優化前提下,運算耗時:

c#:asc c 未優化= 2:1

c#:asc c 充分優化= 4:1   如手工迴圈展開,內聯優化等

asc c優化 :c++11 優化= 1:1   到1.1 :1  說明相同編譯器c 89 和c++ 11在該領域效能相當

c++11 x86 優化:c++11 x64 優化= 1 : 1.1  64bit效能略高

c++11 優化:fortran 95預設 = 1.5 :1  

也就是說c++11 充分優化後的**居然比fortran 95的預設還慢了不少,而c#預設編譯的只有c++11優化後的1/4, fortran的1/6 ,  而且c#的優化空間還很小。

付出了這麼多精力,得到的結果卻如此,難道還得繼續用vim編寫fortran**(intel fortran 2013後對vs的支援有所提公升,但還是適合自行配置vim來開發)

對於gpu和異構計算領域,也嘗試了c#,可以使用,但也是難以發揮硬體的極致效能。

平行計算的話c++ ppl 與c# tpl 在形式上非常接近,為啥效能上卻相差那麼大呢。

追求極限gpu效能的話cuda >opencl >c++amp = openacc 

當然靈活性也逐漸遞減。

為了讓c#適用於高效能計算的話,乙個思路是僅僅利用語法規則,而不使用預設的編譯器,嚴格限定使用少量幾個語法,自行開發編譯前端將c#語言轉譯成c再編譯,但開發者需要自行確保無讀寫訪問衝突。

另乙個思路是仿照cuda/opencl、,將運算密集型部分抽出,轉譯成gpu執行,由於熱點部分部分**規模較小,可限定語法為c的子集。

但在實際應用上,兩個思路也都困難重重,並且放棄了除錯的便利。

哎,c#高效能計算,想說愛你不容易。

什麼是高效能計算?

高效能計算概述 高效能計算 hpc 指通常使用很多處理器 作為單個機器的一部分 或者某一集群中組織的幾台計算機 作為單個計算資源操作 的計算系統和環境。有許多態別的hpc系統,其範圍從標準計算機的大型集群,到高度專用的硬體。大多數基於集群的hpc系統使用高效能網路互連,比如那些來自infiniban...

為什麼高效能計算已遷移到雲

來自intersect360 research和hyperion research的兩份主要分析報告顯示,高效能計算市場已達到拐點。雲部分包括microsoft,amazon web services和google。intersect360表示,高效能計算客戶在高效能雲方面的支出從2016年到201...

define 巨集函式,為什麼能夠提高效能?

define s a,b a b 正確的巨集定義是 define s r r r area s 3,2 第一步被換為area a b 第二步被換為area 3 2 類似於函式呼叫,有乙個啞實結合的過程 預處理 預編譯 工作也叫做巨集展開 在編譯之前,就將巨集名替換為字串。優點 巨集 1 在預處理期被...