2010-11-07 73 views
29

我不瞭解GPU編程概念和API。我有幾個問題:在GPU上運行C#代碼

  1. 是否有可能編寫一段託管C#代碼並將它編譯/轉換爲可在GPU上執行的某種模塊?或者我註定要有兩個實現,一個用於在CPU上管理,另一個用於GPU(我知道在GPU上可以執行的操作會受到限制)?
  2. 是否存在體面和成熟的API來針對各種GPU硬件供應商(即通用API)獨立編程?
  3. 如果想要開發在CPU上運行的應用程序,使用託管語言編寫應用程序,並且如果存在合適的GPU硬件,還可以提供速度優化,是否有最佳做法?

我也很高興能夠鏈接到任何類型的文檔並提供適當的學習資源。

最佳, 約瑟夫

+4

低級代碼最好用低級語言編寫。當有更好的選擇時,在C#中沒有很好的理由。 – 2010-11-07 21:54:37

+0

看到類似的問題: http://stackoverflow.com/questions/375011/utilizing-the-gpu-with-c-sharp – mcmillab 2012-12-05 00:54:39

回答

21

1)否 - 不是爲C#一般情況 - 明明什麼都可以對語言

2)的某個子集創建是 - 使用的Direct X或Open GL HLSL

3)一般不可能 - CPU和GPU編碼是根本不同的

基本上你想不到的CPU和GPU編碼爲相媲美。 GPU是高度專業化的並行處理工具 - 用於大量並行簡單計算。

試圖在一個GPU中編寫一個通用程序,其中包含大量的分支等,但效率不高 - 可能甚至不可能。

他們的內存訪問體系結構完全不同。

您應該爲CPU編寫代碼,但將合適的並行計算遷移到GPU。

+7

-1沒有提及OpenCL或DirectCompute。 – Euphoric 2010-11-08 07:03:24

+7

哎喲 - 那傷害:) – 2010-11-08 12:01:21

+1

-1:OpenGL使用GLSL而不是HLSL着色語言 – 2012-07-17 15:01:30

2

1)不是我所知道的,但可能有一個C#庫可以幫助您。

2)OpenCL。它與GPU無關,甚至可以在CPU上運行。 3)OpenCL將爲你提供幫助,你也可以使用OpenCL編譯CPU,但我不確定它爲CPU提供了多大的代碼。我最近真的愛上了OpenCL,它真的非常棒。

17

1)不,不是C#的一般情況,而是一個小子集,是的。無論是通過運行時(檢查Tidepowerd GPU.NET)或通過語言支持(LINQ或Code Quotations)。 2)是的,DirectCompute(DX11計算着色器)和OpenCL都是獨立於供應商的成熟API,您可以找到它們的.NET綁定。 3)不,像詹姆斯說的那樣,他們是不同的野獸。 GPU是針對高吞吐量數據並行應用而優化的高延遲處理器,而CPU是針對順序通用應用進行優化的低延遲處理器。

我所知道的唯一試圖解決這個問題的研究項目是SPAP語言。

我的建議,不要試圖找到完美的通用API /運行時,因爲沒有。選擇一種現有技術(DirectCompute或OpenCL),並瞭解如何利用它來實現業務。

啓動相關鏈接:

+0

鏈接到tidepowered是死的,這裏是一個git https://github.com/tidepowerd/GPU.NET-Example-Projects – 2015-12-01 12:52:22

2

還有brahma。它應該捕獲表達式並將它們編譯爲GPU。我沒有嘗試過自己。

而且,微軟有一個名爲accelerator的研究原型,其目標類似但語法不同。

-1

對於Java,請參閱Aparapi項目(https://github.com/aparapi/aparapi)。這允許Java的一個子集在任何支持OpenCL的GPU上運行。內核類的字節碼在運行時交叉編譯爲OpenCL代碼。對可以交叉編譯的java代碼有嚴格的限制 - 基本上沒有對象可以用作字段,本地或方法參數。

然而,一個巨大的優勢是內核可以在Java或OpenCL中執行(在適當的GPU/APU設備不可用時自動回退到Java ThreadPool執行)。這聽起來像您在問題的第3部分中所尋找的最接近的東西(當然,託管語言不是C#)。

我不知道任何類似的C#。