2011-05-05 73 views
37

我正在尋找利用GPU來碾壓某些方程式,但無法弄清楚如何從C#訪問它。我知道XNA和DirectX框架允許您使用着色器來訪問GPU,但是如何在沒有這些框架的情況下訪問它?如何使用GPU進行數學

+0

NVidia,ATI,英特爾或通用? – Bobby 2011-05-05 08:30:21

+0

@Bobby:我正在尋找一些通用的,理想的。 – 2011-05-05 08:31:05

+7

查看顯示如何檢測圖形卡並運行代碼或回退到CPU的答案會很有趣。 – tiagoboldt 2011-05-05 08:31:54

回答

11

我還沒有從C#做過,但基本上你使用CUDA(假設你在這裏使用nVidia卡,當然)SDK和CUDA工具包來實現它。

nVidia已經移植(或寫入?)BLAS實現以用於支持CUDA的設備。他們提供了大量關於如何進行數字運算的示例,但您必須弄清楚您將如何從C#中解脫出來。我敢打賭,你將不得不用非託管的C或C++編寫一些東西並與之鏈接。

如果您不想使用C#,請查看Theano。這對您的需求可能有點矯枉過正,因爲他們正在構建一個框架,用於從Python進行GPU的機器學習,但是......它的工作原理非常好。

7

Brahma(LINQ to GPU)?

得愛LINQ!

+1

哎呀,剛纔發現我把鏈接弄壞了。感謝編輯@Bobby,(仍然在學習)。 – 2011-05-05 09:18:16

0

恐怕我在使用GPU方面的知識在理論上超出了爲DirectX/XNA編寫着色器並且與CUDA(NVidia特定版本)有點關係。不過,我已經聽說了很多關於OpenCL(開放計算語言)的知識,它允許您運行OpenCL智能推送到顯卡的算法,或者如果您沒有兼容的GPU,可以在CPU上運行。

您在GPU上運行的代碼必須專門寫在OpenCL的C99子集中(如果這不符合您的要求,因爲您已經問過如何從C#中使用它),但超出了您的數字運算算法,您可以使用C#編寫應用程序的其餘部分,並通過使用Open Toolkit很好地協同工作;

http://www.opentk.com/

7

如果你的GPU是NVIDIA,你可以使用CUDA

這裏有一個例子,解釋所有的鏈,包括一些C/C++代碼:CUDA integration with C#

而且還有一個CUDA.NET庫調用可以在這裏找到:CUDA.NET

如果你的GPU是ATI ,那麼有ATI Stream。 .NET支持對我來說不太清楚。也許Open Toolkit Library有它,通過OpenCL支持。

最後,有一個名爲「Accelerator」的微軟研究項目,該項目有一個可在任何硬件(只要它支持DirectX 9)上工作的託管包裝器。

1

有兩種選擇,如果你不想惹的P/Invoke的東西和非託管代碼:

  1. 使用提到CUDA.NET庫。它工作得很好,但它的目標是CUDA,所以只有nVidia卡。如果你想解決更復雜的問題,你必須學習CUDA,編寫你自己的內核(用C語言編寫),用nvcc進行編譯,並通過這個庫從C#執行。
  2. 使用Microsoft Research Accelerator。這是MS Research構建的一個很好的庫,它可以在任何有很多內核(多核nVidia/ATI GPU和多核處理器)上運行代碼。它完全獨立於平臺。使用它,我對結果印象深刻。在C#中使用加速器也有很好的tutorial

第二種選擇是我推薦,但是如果你堅持使用nVidia GPU沒有問題 - 第一種方法可能會更快。

1

我已經在C#中利用NVIDIA的CUDA庫和.NET的P/invoke完成了它。這需要一些謹慎的內存管理和對CUDA庫的詳細瞭解。這種技術可以與任何你想在C中創建的定製GPU/CUDA內核結合使用,因此這是一種非常強大的靈活方法。

如果您想節省很多精力,您可以從CenterSpace軟件(我工作的人)購買NMath Premium,並且您可以在幾分鐘內在C#上運行NVIDIA GPU上的大問題。 NMath Premium是一個大型的C#/。NET數學庫,它可以在GPU上運行大部分LAPACK和FFT,但如果硬件不可用或者問題大小不合理,則會退回CPU。

相關問題