2008-10-13 121 views
3

我正在探索將常見C#代碼構造映射到C++ CUDA代碼以在GPU上運行的各種選項。該系統的結構如下(箭頭表示方法調用):將C#方法轉換爲C++方法

C#程序 - > C#GPU LIB - > C++ CUDA實現LIB

在GPU庫的方法可能看起來像這樣:

public static void Map<T>(this ICollection<T> c, Func<T,T> f) 
{ 
    //Call 'f' on each element of 'c' 
} 

這是對每個元素運行函數的ICollection類型的擴展方法。不過,我想要做的是調用C++庫並使其在GPU上運行這些方法。這需要將函數以某種方式轉換爲C++代碼。這可能嗎?詳細說明一下,如果我的庫的用戶執行一個帶有一些任意代碼的方法(用C#),我想將這些代碼翻譯成C++ equivelant,以便我可以在CUDA上運行它。我覺得有沒有簡單的方法來做到這一點,但我想知道是否有辦法做到這一點或達到一些相同的效果。

我想知道的一件事是捕獲函數來轉換表達式並使用它將其映射到C++ equivelant。任何人都有這方面的經驗?

回答

7

CUDA.Net如果你想要一些參考如何C#可以在GPU上運行。

+0

GREAT鏈接,謝謝!!! – endian 2008-10-14 08:06:09

2

說實話,我不確定我完全理解你在做什麼。但是,您可能對將.NET應用程序/庫轉換爲直接的C++而無需任何.Net框架的此項目感興趣。 http://www.codeplex.com/crossnet

0

有趣的問題。我在C#上不是很專業,但我認爲ICollection是一個容器對象。如果c的每個元素都是像素,則必須進行大量編組才能將其轉換爲CUDA可以使用的字節或浮點緩衝區。我懷疑這會讓所有的東西放慢速度,否定在GPU上做任何事情的優勢。

0

你可以做的是編寫自己的IQueryable LINQ provider,就像LINQ to SQL將LINQ查詢翻譯成SQL一樣。

但是,我用這種方法看到的一個問題是,LINQ查詢通常是懶惰地評估的。爲了從管道中受益,這可能不是一個可行的解決方案。

也許值得研究如何爲C#和CUDA實現Google的MapReduce API,然後使用類似於PyCuda的方法將邏輯發佈到GPU。在這種情況下,查看已有的MapReduce implementation in CUDA也可能有用。

0

這是一個非常有趣的問題,我不知道如何做到這一點。

但是,Brahma library似乎做了非常類似的事情。您可以使用LINQ定義函數,然後編譯爲GLSL着色器以在GPU上高效運行。看看他們的code,尤其是Game of Life樣本。

1

我建議以下進程加快一些使用CUDA的C#程序的計算:

  • 首先,創建您的P/Invoke的功能,你想要一個非託管 C++庫加速。這將限制您在CUDA中輕鬆使用的數據類型。
  • 將您的非託管庫與您的C#應用​​程序集成。如果你正在做的事情,你應該已經注意到某種加速。如果不是,你應該放棄。
  • 替換庫中的C++函數(不更改其接口),以使用CUDA內核在GPU上執行計算。
相關問題