45

我一直在寻找,但运气不佳。OpenCL是否有任何有据可查的 .NET 绑定实现?(如果必须的话,我会为 CUDA 买点东西)。我遇到过各种实现,CUDA.NET、OpenCL.NET、OpenTK / Cloo(我知道,它们经常在 stackoverflow 中被提及),但它们似乎都处于 alpha 阶段,或者完全没有可用的示例。CUDA.NET 有一些帮助文件,但它只是一个库参考,并不能真正帮助您入门。

我希望找到的是一个成熟的.NET GPU 编程库。最终我需要能够用 F# 编写代码,但我会采用任何兼容 .NET 的语言,因为我总是可以稍后转换它并使用包含的任何示例来启动和运行。

自从我到处搜索以来,这可能是一个很长的机会,但我希望这只是我不知道要搜索的正确内容的情况之一。

任何帮助将不胜感激。

4

7 回答 7

34

好吧,您所说的所有库都是 opencl 本机库的简单包装器。它们构成了相对少量的附加抽象,并且非常接近一般的 opencl 函数。因此,如果您总体上熟悉 opencl,您将很快熟悉这些库。

我认为“OpenCL.NET”的实现是完整的,它没有任何不是 OpenCL 的东西。但是用了几次之后,我发现它的水平太低了。

我已经创建了自己的包装器,它通过显着简化主机部分为我提供了很好的服务,这是我的一个项目的主机部分(如果您有兴趣,我可以在 github 或任何其他 svn 服务中发布我的 OpenCl 包装器):

using System;
using System.Net;
using System.Collections.Generic;
using System.IO;

using Shared;
using Shared.IO;
using Shared.OpenCL;

namespace Testing
{
    public class ApplicationClass
    {
        static Random rand = new Random();

        static Single[] RandomArray(Int32 length)
        {
            Single[] result = new Single[length];

            for (int i = 0; i < result.Length; i++)
            {
                result[i] = (Single)rand.NextDouble();
            }

            return result;
        }

        static void Main(string[] args)
        {
            DeviceGlobalMemory output = new Byte[4096];

            DeviceGlobalMemory indeces = RandomArray(102400);
            DeviceGlobalMemory ops = new Byte[3072];
            DeviceGlobalMemory data = RandomArray(1048576);

            Console.Write("Creating kernel...");

            Kernel kernel = Kernel.Create("Kernel", File.ReadAllText("Test.c"), data, indeces, ops, output);

            Console.Write("Executing kernel...");

            Event e = kernel.Execute(256, 256);

            kernel.CommandQueue.Finish();

            Console.WriteLine("done, operation took {0}", Profiler.DurationSeconds(e));

            UnmanagedReader reader = new UnmanagedReader(new DeviceBufferStream(output));

            for (int i = 0; i < 256; i++)
            {
                if (i % 4 == 0) Console.WriteLine();
                if (i % 16 == 0) Console.WriteLine();

                Console.Write("{0}\t", reader.Read<Single>());
            }
        }
    }
}
于 2011-04-26T07:33:51.190 回答
14

OpenTK http://sourceforge.net/projects/cloo/还有另一个绑定库。

他们将其定位为“与原始绑定相比,它提供了更清洁的 OpenCL API(如果您需要它们也可以使用)”和“Cloo 是一个开源、易于使用的托管库,它使 .NET/Mono 应用程序能够充分利用 OpenCL 框架。”

样品看起来很有前景。

于 2011-07-02T11:18:48.363 回答
8

我还有一组开源 OpenCL 绑定。网。我主要是为自己编写的,以便它忠实地反映 OpenCL API,同时对 .NET 友好。这个库永远不会有任何 OOP 抽象,而且它的性能非常好。

http://openclnet.codeplex.com

希望这可以帮助。

于 2011-06-18T03:47:22.690 回答
3

多年来,我使用了一些不同的 C# OpenCL 包装器,现在正在使用 NOpenCL。它写得很好,并且在 MIT 许可证下。

https://github.com/tunnelvisionlabs/NOpenCL

于 2016-01-05T03:43:20.970 回答
1

我同意olegz的回答。我才开始使用 OpenCL,但 Cloo 似乎是一个非常好的选择。我发现它使用起来非常简单,并且从许多来源我听说它的功能也非常丰富。

查看以下站点,其中还包含一些 Cloo 示例: http ://www.cmsoft.com.br/

于 2011-07-06T14:07:59.530 回答
1

对于 F#,我找到了这个:https ://github.com/GabrieleCocco/FSCL.Compiler (FSharp 到 OpenCL 编译器)

于 2014-02-14T10:28:54.107 回答
1

我一直在使用 OpenCLTemplate。

你可以在这里找到一个很棒的教程: http ://www.cmsoft.com.br/index.php?option=com_content&view=category&layout=blog&id=41&Itemid=75

它对我来说很好。我建议你也应该看看 Cloo。

于 2013-04-05T09:28:35.703 回答