完整的.NET OpenCL实现

Ada*_*ile 43 .net c# opencl opencl.net

我一直在寻找,但运气不佳.OpenCL 是否有任何记录良好的 .NET绑定实现?(如果必须,我会为CUDA采取一些措施).我遇到了各种各样的实现,CUDA.NET,OpenCL.NET,OpenTK/Cloo(我知道,它们经常被提到stackoverflow),但它们似乎都处于alpha阶段或绝对没有可用的例子.CUDA.NET有一些帮助文件,但它只是一个库引用,它并没有真正帮助你入门.

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

自从我搜遍了以后可能是一个很长的镜头,但我希望这只是我不知道正确搜索的情况之一.

任何帮助将不胜感激.

Lu4*_*Lu4 32

好吧,你所说的所有库都是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>());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 什么意思*"OpenCL.NET不够可扩展"*?你是说它无法处理大量的工作?或者不是多线程安全? (5认同)
  • 这是项目链接http://code.google.com/p/manocl svn和git都支持git repo路径:ssh://gitslave.xp-dev.com/ManOCL (2认同)

ole*_*egz 14

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

他们将其定位为"与原始绑定相比,它提供了更清洁的OpenCL API(在您需要它们的情况下也可用)"和"Cloo是一个开源,易于使用,托管的库,它支持.NET/Mono应用程序充分利用OpenCL框架."

样本看起来很有希望.


Ani*_*Ani 8

我也有一套开源的OpenCL绑定.净.我为自己编写了这个主要是为了在.NET友好的同时忠实地反映OpenCL API.这个库永远不会有任何OOP抽象,并且它非常高效.

http://openclnet.codeplex.com

希望这可以帮助.