【问题标题】:Complete .NET OpenCL Implementations [closed]完整的 .NET OpenCL 实现 [关闭]
【发布时间】:2011-08-04 23:20:53
【问题描述】:

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

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 为什么需要“.NET 中的 OpenCL”示例?只要您首先“使用”正确的命名空间,任何 OpenCL 示例都应该可以正常工作。
  • 对于未来的任何人,我为 .NET Core 制作了一个 OpenCL.Net 分支:github.com/FracturedCodes/OpenCL.NetCore

标签: c# .net opencl opencl.net


【解决方案1】:

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

http://openclnet.codeplex.com

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

    https://github.com/tunnelvisionlabs/NOpenCL

    【讨论】:

      【解决方案3】:

      嗯,您所说的所有库都是 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>());
                  }
              }
          }
      }
      

      【讨论】:

      • 我很想得到一份你的包装纸。你能把它发给我(地址可根据要求提供)或张贴在某个地方吗?
      • 这里是项目链接code.google.com/p/manocl 支持 svn 和 git git repo 路径:ssh://gitslave.xp-dev.com/ManOCL
      • 如果有人对使用 OpenCL 进行图像处理感兴趣,您可以使用此处提供的代码:stackoverflow.com/questions/13624016/…
      • “OpenCL.NET 的可扩展性不够” 是什么意思?你的意思是它不能处理大量的工作?还是不是多线程安全的?
      • 可能不是最好使用的术语,我的意思是当您的应用程序开始增长时,您最终会在项目中分配大量混乱......
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我一直在使用 OpenCLTemplate。

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

        对我来说效果很好。我建议你也应该去看看 Cloo。

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • IMO 这些例子不是很容易找到,因此这里有一个深层链接:cmsoft.com.br/…
          【解决方案7】:

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

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

          这些样本看起来很有前景。

          【讨论】:

          • 我在您链接的 SourceForge 网站上找不到任何示例或文档,我是否忽略了它?
          • 查看下载存档中的文件。 Clootils 包含各种样本。请参阅文档文件夹以供参考。
          • 很好,它甚至还有一个 NuGet 包,只需搜索“Cloo”(确切的包 ID 是“Sourceforge.Cloo”)。
          猜你喜欢
          • 2012-09-22
          • 2010-11-27
          • 1970-01-01
          • 2011-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-02
          相关资源
          最近更新 更多