【问题标题】:Using SIMD in a CLR C++ library在 CLR C++ 库中使用 SIMD
【发布时间】:2014-01-31 19:18:31
【问题描述】:

C# 和 Visual Basic 以及 .NET CLR 是用于用户界面和业务线应用程序等的优秀开发环境。

但是,我已经编写了很多执行时间在O(n^3): n > 1000 左右的代码,并且在几个地方,比这更高。基本上这些循环从一个大数组中读取,做一些数学运算并进行五六个测试,然后将结果写入第二个相同大小的数组。

其中大部分是从英特尔 Fortran 程序移植的代码,以便将它们带入 64 位世界。我注意到,如果没有对该代码进行任何自动矢量化,执行时间会慢得多。 .NET 不支持使用目前销售的每个英特尔处理器上的 SIMD 操作。

由于函数已经以严格的算法编写,可以由熟练的程序员移植,我认为要求程序员将代码移植到 C++ CLR 库可能是一种方法。

  • 是否可以获得一个自动矢量化的 C++ 库,并提供 CLR 接口供 C#/VB 程序调用?
  • 如果没有,是否存在解决方法? COM 接口是一种这样的解决方法吗?
  • 如果是,它必须采取什么形式?

【问题讨论】:

    标签: c# c++ .net vectorization auto-vectorization


    【解决方案1】:

    当然,没问题。 C++/CLI 类库项目为您提供了编写托管包装器的方法,即 ref 类,它可以直接调用本机 C++ 代码。任何托管代码都可以直接使用这样的类。

    在原生 C++ 代码中获得自动矢量化和自动并行化需要 VS2012 或更高版本。设计互操作层以最小化从托管代码到非托管代码并返回的转换次数可能很重要。换句话说,不要一次复制单个 double 值。

    【讨论】:

    • 所以,为了有效地使用它,我想做一个非常粗略的入口点,它采用完整的float[,,] 数组并返回另一个包含计算结果的float[,,]...并且我可以指定一个接口,ref 类 和 C# 代码将在没有大量 COM 文件夹的情况下使用?
    • 是的,类似的。 COM与它无关,您不需要接口。你需要找一个至少有点熟悉 C++/CLI 的程序员,或者花几个星期左右的时间来学习这门语言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2022-10-03
    • 2021-08-31
    • 1970-01-01
    相关资源
    最近更新 更多