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後預先編譯的查詢。

使用上我們需先加入下列參考: Brahma.dll Brahma.DirectX.dll or Brahma.OpenGL.dll Microsoft.DirectX.dll Microsoft.DirectX.Direct3D.dll

並加入以下命名空間: Brahma 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(computationProvider, new[] { 0f, 1f, 2f, 3f, 4f, 5f, 6f });

// Compile the query CompiledQuery query = computationProvider.Compile> ( 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();

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

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

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

your first brahma program

使用Brahma在GPU上運行LINQ

Frequently Asked Questions

brahma quick reference

getting started

output size considerations

computation provider

a parallel array