C# 完整的.NETOpenCL实现

C# 完整的.NETOpenCL实现,c#,.net,opencl,opencl.net,C#,.net,Opencl,Opencl.net,我到处找了,但运气不好。是否有针对OpenCL的文档化的.NET绑定实现?(如果有必要,我会给库达带点东西)。 我遇到过各种各样的实现,CUDA.NET、OpenCL.NET、OpenTK/Cloo(我知道,它们经常提到stackoverflow),但它们似乎都处于alpha阶段,或者完全没有可用的示例。CUDA.NET有一些帮助文件,但它只是一个库参考,对您的入门没有帮助 我希望在.NET中找到一个成熟的GPU编程库。 最终我需要能够用F#编写代码,但我会使用任何与.NET兼容的语言,因为我总

我到处找了,但运气不好。是否有针对OpenCL的文档化的.NET绑定实现?(如果有必要,我会给库达带点东西)。 我遇到过各种各样的实现,CUDA.NET、OpenCL.NET、OpenTK/Cloo(我知道,它们经常提到stackoverflow),但它们似乎都处于alpha阶段,或者完全没有可用的示例。CUDA.NET有一些帮助文件,但它只是一个库参考,对您的入门没有帮助

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

也许我已经搜索了很多次了,但我希望这只是我不知道该搜索什么的情况之一


任何帮助都将不胜感激。

好吧,您提到的所有库都是opencl本机库的简单包装。它们带来的附加抽象相对较少,并且非常接近一般的opencl函数。因此,如果您一般熟悉opencl,您很快就会熟悉这些库

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

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

使用系统;
Net系统;
使用System.Collections.Generic;
使用System.IO;
使用共享资源;
使用Shared.IO;
使用Shared.OpenCL;
命名空间测试
{
公共类应用程序类
{
静态随机兰德=新随机();
静态单[]随机数组(Int32长度)
{
单个[]结果=新的单个[长度];
for(int i=0;i
我也有一套用于的开源OpenCL绑定。净。我写这篇文章主要是为了在对.NET友好的同时忠实地反映OpenCLAPI。这个库永远不会有任何OOP抽象,而且性能非常好


希望这有帮助。

OpenTK还有另一个绑定库

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

样品看起来很有希望。

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

查看以下网站,其中还包括一些Cloo示例:

我一直在使用OpenCLTemplate

您可以在此处找到一个很棒的教程:


这对我很管用。我建议你也去看看Cloo。

对于F,我发现了这个:(FSharp to OpenCL编译器)

多年来我使用了一些不同的C#OpenCL包装,现在正在使用NOpenCL。它写得很好,并且是在麻省理工学院的许可下


为什么需要一个“OpenCL in.NET”示例?只要您先“使用”正确的名称空间,任何OpenCL示例都应该可以正常工作。对于未来的任何人,我为.Net Core制作了一个OpenCL.Net fork:我很想得到您的包装器的副本。您可以将其发送给我(地址可根据要求提供)或将其发布到某处吗?以下是支持svn和git的项目链接git repo路径:ssh://gitslave.xp-dev.com/ManOCLIn 如果有人对OpenCL的图像处理感兴趣,您可以使用这里提供的代码:“OpenCL.NET不够可扩展”是什么意思?你是说它不能处理大量的工作吗?或者说多线程不安全?可能不是最好的术语,我的意思是,当你的应用程序开始增长时,你的项目会变得一团糟……我在你链接的SourceForge站点上找不到任何示例或文档,我是否忽略了它?请参阅下载的存档中的文件。Clootils含有各种样品。请参阅文档文件夹以获取参考。很好,它甚至有一个NuGet软件包,只需搜索“Cloo”(确切的软件包Id为“Sourceforge.Cloo”)。在我看来,这些示例并不是直接找到的,因此这里有一个深层链接:
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>());
            }
        }
    }
}