【问题标题】:Executing CPU/GPU instructions from managed code从托管代码执行 CPU/GPU 指令
【发布时间】:2011-01-07 09:06:01
【问题描述】:

考虑到执行禁用位,从高级托管环境(如 VB.NET 2008 或 C#)对本机处理器执行指令的推荐方式是什么。此外,有没有人在针对图形处理器执行 GPU 指令时取得了类似的成绩?

【问题讨论】:

标签: .net gpu


【解决方案1】:

有一些用于 C# 的 GPU 选项,用于直接访问而无需恢复为 P/Invoke 或编写您自己的 C++ 包装器:

  • Brahma 很有趣。它通过定制的 LINQ 提供程序直接提供对 GPU 的访问。该代码包含一些在 GPU 上运行的高计算方法示例,全部通过 LINQ 用 C# 编写。
  • SlimDX 为所有主要的 DirectX 功能提供了一个很好的 .NET 包装器。使用自定义着色器,您可以通过 DirectX 在 GPU 上进行计算。它还包括 DX11 支持,因此您可以直接使用计算着色器(如果您有硬件)。
  • 您可以通过CUDA.NET 访问CUDA。
  • 您可以通过OpenCL.NET 使用 OpenCL。

对于 CPU 指令,这通常需要使用汇编指令下降到较低级别的本机代码。可能最有趣的完全托管(至少部分相关)选项是使用Mono.Simd,当在 Mono 堆栈上运行时,它可以从托管代码直接访问 CPU 中的 SIMD 指令。

【讨论】:

  • 感谢 Mono.Simd 链接很棒
【解决方案2】:

这不是一个选项。您必须使用内联汇编或内在函数 P/Invoke DLL 中由 MASM 生成或用非托管 C/C++ 编写的函数。或者使用 C++/CLI 编译器生成混合模式代码并使用 #pragma managed。

请注意,您现在不能再依赖 JIT 编译器生成适合操作系统的任何平台代码。使用 Project + Properties、Build 选项卡、Platform Target 来强制架构匹配您的非托管代码。

查看 CUDA 以获取托管 GPU 代码。

【讨论】:

    【解决方案3】:

    使用您想要的任何指令创建非托管 .dll 库并使用 P/Invoke 调用它。

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 2020-04-28
      • 2013-10-28
      • 2013-08-24
      相关资源
      最近更新 更多