Linq to GPU (Brahma)

Brahma為一C#開源庫,可用以撰寫高階Linq語法,將處理分散給GPU平行運算,實現Linq to GPU的功能。其主要類別有ComputationProvider、DataParallelArray、CompiledQuery 。

ComputationProvider為Brahma核心類別,具DirectX與OpenGL兩個版本。DirectX版本的ComputationProvider需裝有DirectX SDK或是DirectX end-user redistributable才可使用,可幫我們將程式碼轉換成HLSL(High Level Shading Language)交由DirectX去做處理。OpenGL版本的ComputationProvider則需在裝有Tao OpenGL bindings for .NET/Mono的環境下執行,可將程式碼轉換成OpenGL Shading Languag交由OpenGL去做處理。

DataParallelArray類別為處理運算的主要資料結構,有一維與二維兩種,為一泛型的資料結構,其元素限定可為float、Vector2、Vector3、Vector4幾種。

而CompiledQuery類別則是用以存放呼叫ComputationProvider.Compile後預先編譯的查詢。

使用上我們需先加入下列參考:

  1. Brahma.dll
  2. Brahma.DirectX.dll or Brahma.OpenGL.dll
  3. Microsoft.DirectX.dll
  4. Microsoft.DirectX.Direct3D.dll

並加入以下命名空間:

  1. Brahma
  2. Brahma.DirectX or Brahma.OpenGL

接著建立ComputationProvider物件實體與運算要用的DataParallelArray資料,透過ComputationProvider.Compile預先將運算編譯成CompiledQuery,再把預先編譯的CompiledQuery運算與要做運算的DataParallelArray資料帶入ComputationProvider.Run就可以了。

這邊直接來看一下Brahma網站中提供的使用範例:

           // Create the computation provider
var computationProvider = new ComputationProvider();

// Create a data-parallel array and fill it with data
var data = new DataParallelArray<float>(computationProvider,
new[] { 0f, 1f, 2f, 3f, 4f, 5f, 6f });

// Compile the query
CompiledQuery query = computationProvider.Compile<DataParallelArray<float>>
(
d => from value in d
select value * 2f
);

// Run the query on this data
IQueryable result = computationProvider.Run(query, data);

// Print out the results
foreach (float value in result)
Console.WriteLine(value);

// Get rid of all the stuff we created
computationProvider.Dispose();
data.Dispose();


運行後可看到如下執行結果:

2010-11-16_173821

若要進一步學習可翻閱Brahma專案中所附的三個範例專案。

值得注意的是DataParallelArray類別其元素型態限制為Float、Vector2、Vector3、與Vector4,其中Vector型態的成員是w、x、y、z等屬性,主要用於座標上的處理,而float則是做其它的運算,由於有這樣的限制,所以Brahma感覺並不能很容易的將我們一般的處理送給GPU運算,Brahma在使用上也許被定位專門用來處理繪圖運算。

Link


  • your first brahma program


  • 使用Brahma在GPU上運行LINQ


  • Frequently Asked Questions


  • brahma quick reference


  • getting started


  • output size considerations


  • computation provider


  • a parallel array