【问题标题】:Calling SSE code in managed code (alignment)在托管代码中调用 SSE 代码(对齐)
【发布时间】:2011-12-28 19:10:14
【问题描述】:

这是我的问题:我们有一个用 C++ 编写的数学库,它大量使用 SSE。我们需要在我们的工具(用 C# 编写)的托管层中使用相同的数学库。

问题是,数学库类必须是 16 字节对齐的(SSE 才能工作)。但是,在编译托管代码时,我会遇到很多错误,因为不支持“__declspec (align(X))”。

任何想法这是否可能以某种方式?我找不到任何有用的信息。

一些附加信息:

用 C++ 编写的数学库使用 SSE 来获得最佳性能。但是,我们的工具不需要最高性能,与一般的 C# 代码相比,我们甚至可以承受性能损失。更重要的是能够实际执行我们所有的代码(这是一个巨大的代码库),而无需人们在数据类型之间来回转换。

所以这实际上只关乎可用性,而不关乎性能。

我试过这个:我把我们所有的数学函数放到一个 cpp 中,而不是把它们作为内联函数。现在它们从自己的 DLL 中导出。但是,vector-class 当然仍然有一个 __m128 私有成员用于其数据。

只要我将这样一个变量放入托管代码中,编译器就会告诉我我的托管代码现在是本机代码。

这是否意味着我的类定义中不能有这样的类型并将其完全隐藏在 DLL 接口后面?谢谢。

【问题讨论】:

  • 对于谁反对这个,请提供解释。我认为这个问题没有问题。
  • 为什么不对这些部分强制进行原生编译呢? (我认为无论如何性能都会如此)
  • @Jan - 您能否澄清您的原始数学 C++ DLL 是本机代码还是托管 (C++/CLI) 代码?谢谢。
  • 数学代码位于原生 C++ DLL 中。我尝试从托管 C++ 访问它(它包装了本机代码,以便它可以被 C# 代码调用)。问题是 C++ 类有一个私有成员“__m128”,托管代码编译器当然可以看到它,但它不喜欢它。看来我必须将所有 SSE 代码隐藏在函数中,这使得数学库不是很有用。

标签: c# c++ alignment managed sse


【解决方案1】:

听起来您正在尝试将数学库编译为托管代码?相反,您应该将其保留在本机代码中,并使用 P/Invoke 从托管代码中直接调用它。

将所需结构从 C# 编组为具有正确对齐方式的本机代码仍然很复杂,但应该是可行的。

here 显示的工作可能有助于您理解这些问题。

我正在尝试加速 使用 SSE2 完全用 C#.NET 编写的模拟应用程序。迄今为止 我花了几天时间研究在一个应用程序中使用 SSE2 的可行性 .NET 应用程序。

【讨论】:

  • 他使用的是 C++/CLI,不需要 pinvoke。
  • @Hans - 你怎么知道的?
  • the compiler tells me that my managed code is now native code.
  • 当我阅读它时,它指的是从 DLL 导出的数据。谈论 C++ DLL 通常并不意味着 C++/CLI - 如果他说程序集包含 C++ SSE 数学代码,那么我会同意你的看法。这还不清楚,我会要求 OP 澄清。
【解决方案2】:

struct打包能帮到你吗?

http://www.developerfusion.com/article/84519/mastering-structs-in-c/

您可以使用它将字段与内存中的特定区域对齐。

【讨论】:

  • 嗯,我将不得不调查这些选项。感谢您提供信息。
【解决方案3】:

好吧,只是总结一下:

我们认为让我们的代码直接与 SSE 数学库一起工作太复杂了。所以我们将有两个数学库。将 SSE 用于高性能代码的一种,它将在我们的 C++ 代码中深入使用。另一种是在没有 SSE 的情况下实现的,它将用于所有接口和对性能要求不高的代码。

通过这种方式,我们可以使用托管代码编译和链接所有内容,但仍然可以通过在真正重要的地方使用 SSE 代码来提高我们的性能。

但是,如果编译器可以“看到” SSE 的东西(例如,你只是在一个类中拥有一个 __m128 成员),那么使用托管代码编译任何东西就是一场噩梦。您必须在所有内容周围放置大量包装器。

我猜这只是 C# 和托管代码从未真正兼容的用例。

无论如何,感谢您的所有建议,它帮助我更清楚地了解问题。

【讨论】:

  • 避免在您的帖子上签名,您的个人资料与您已发布的所有内容相关联。
【解决方案4】:

顺便说一句,fftw wrapper I use 调用 fftw 方法进行内存分配,然后将数据填充到托管代码中,然后再次调用 fftw 进行处理。你能用类似的范式吗?

【讨论】:

    猜你喜欢
    • 2013-08-24
    • 2011-01-31
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2011-04-29
    • 2013-12-29
    • 2011-01-29
    • 2012-07-03
    相关资源
    最近更新 更多