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 在預處理期被...