有关GPGPU库的建议

问题描述 投票:0回答:1

我正在编写一个应用程序,最终它可以很好地并行化:

two dimensional float initialData and result arrays
for each cell (a, b) in result array:
    for each cell (i, j) in initialData:
        result(a, b) += someComputation(initialData(i, j), a, b, i, j, some global data...);

有关算法的更多细节:

  • 我想让第一个循环的迭代同时运行(也许有更好的方法?)
  • 初始数据以只读方式访问
  • someComputation相当简单,它涉及乘法,加法,余弦计算,所以它可以通过GPU来完成,但是,它需要它正在处理的元素的索引
  • 任何维度的阵列都不会超过~4000

图书馆资产:

  • 程序将用C#编写(使用WPF),如果它(已经)具有易于使用的.NET绑定,那将会很好
  • 如果没有找到GPU,算法应该在CPU上运行
  • 程序将仅限Windows,并且Windows XP支持是非常可取的。
  • 算法可以在OpenCL中重写,但是,我认为它不像像素着色器那样受到广泛支持。但是,如果没有其他选择,OpenCL就可以了。 (AFAIK CUDA仅在nVidia GPU上运行,OpenCL涵盖nVidia和AMD的GPU)

我试图查看Microsoft Accelerator库,但我还没有找到传递数组索引的方法。任何帮助都会让我感激不尽,请原谅我的英语。

c# .net opencl gpgpu
1个回答
0
投票

有低级OpenCL绑定:OpenCL.NET:http://openclnet.codeplex.com/。此外,存在基于OpenCL.NET的F#绑定:https://github.com/YaccConstructor/Brahma.FSharp

它允许您编写“本机”F#代码并通过OpenCL在GPU上运行它。例如,矩阵乘法的代码(没有提供者配置):

//Code for run on GPU
let command = 
    <@
        fun (r:_2D) columns (a:array<_>) (b:array<_>) (c:array<_>) -> 
            let tx = r.GlobalID0
            let ty = r.GlobalID1
            let mutable buf = c.[ty * columns + tx]
            for k in 0 .. columns - 1 do
                buf <- buf + (a.[ty * columns + k] * b.[k * columns + tx])
            c.[ty * columns + tx] <- buf
    @>

//compile code and configure kernel
let kernel, kernelPrepare, kernelRun = provider.Compile command
let d =(new _2D(rows, columns, localWorkSize, localWorkSize))
kernelPrepare d columns aValues bValues cParallel
//run computations on GPU
let _ = commandQueue.Add(kernelRun()).Finish()            

//read result back
let _ = commandQueue.Add(cParallel.ToHost(kernel)).Finish()
© www.soinside.com 2019 - 2024. All rights reserved.