Linq to GPU (Brahma)

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網站中提供的使用範例:


            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