【发布时间】: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