【问题标题】:Advice needed regarding GPGPU library需要关于 GPGPU 库的建议
【发布时间】:2012-01-12 15:35:51
【问题描述】:

我正在编写一个应用程序,最终它涉及到可并行化的部分:

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 库,但我还没有找到传入数组索引的方法。 任何帮助都会受到赞赏,并请原谅我的英语。

【问题讨论】:

  • “但是,我相信它不像像素着色器那样被广泛支持”——这取决于:如果你想支持旧硬件(predirectX10 是真的),但是你可以在cpu,因此编写代码以回退到 cpu 非常简单(当然,使用完全相同的代码路径可能不是最理想的,但仍然(除了最关键的路径可能需要 AMD 和 NVIDIA 的不同实现)(也可能是不同的代) )。
  • 一旦你开始工作,别忘了 CPU 和 GPU 是不同的。 CPU 需要更细粒度的线程,因为它们的硬件线程很少,而 GPU 需要更细粒度的线程,因为它们有很多硬件线程。这意味着您可能需要根据哪个拱调整 FOR 循环。
  • @Grizzly,我想支持尽可能广泛的硬件(当然编码更少,或者通过一种简单的方法来确定正在运行的硬件程序以选择算法的变化)。
  • @Bengie,这个算法无法优化,所以如果在 CPU 上运行它只会降级(因为迭代将按顺序运行),而在 GPU 上它会运行得更快(因为可能有一些并发迭代)。
  • @EdgeLuxe:我不知道您的计算结果如何,但我建议在 DX10 之前的硬件上远离 gpgpu,因为它很少值得麻烦(为了获得良好的性能,您最终可能会编写每一代 DX9 的代码路径,但仍然只能获得非常适中的加速)。调整的要点是,您不能在不同的硬件平台上运行相同的代码,并使其在所有硬件平台上都处于最佳状态。它可能会在所有这些设备上运行,但对于某些人来说,性能可能会很差。

标签: c# .net opencl gpgpu


【解决方案1】:

存在低级 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2014-01-19
    • 1970-01-01
    相关资源
    最近更新 更多