我的问题是:我们有一个用c++编写的数学库,它大量使用SSE。我们需要在我们的工具的管理层(用c#编写)中使用相同的数学库。
问题是,数学库类必须是16字节对齐的(为了SSE工作)。然而,在编译托管代码时,我得到了很多错误,因为不支持"__declspec (align(X))"。
你知道这是否可能吗?我没能找到任何有用的信息。
一些附加信息:
用c++编写的数学库使用SSE来获得最佳性能。然而,我们的工具并不需要最大的性能,与一般的c#代码相比,我们甚至可以承受性能上的打击。它更重要的是能够实际执行我们所有的代码(它是一个巨大的代码库),而不需要人们在数据类型之间来回转换。
所以这真的只是关于可用性,而不是性能。
我试过这样做:我把所有的数学函数放入一个cpp中,而不是把它们作为内联函数。现在它们从自己的DLL中导出。然而,vector类当然仍然有一个__m128私有成员来存放它的数据。
当我把这样一个变量放入托管代码时,编译器告诉我,我的托管代码现在是本机代码。
这是否意味着我不能在我的类定义中有这样的类型,并将其完全隐藏在DLL接口后面?谢谢。
听起来您正在尝试将数学库编译为托管代码?相反,您应该将其保留在本机代码中,并使用P/Invoke从托管代码直接调用它。
将所需的结构从c#编组到本机代码中并正确对齐仍然很复杂,但应该是可行的。
这里显示的工作可能对您理解问题很有用。
我正着手尝试加速a的冒险过程完全用c#编写的仿真应用程序。. NET使用SSE2。到目前为止我花了几天的时间来研究使用SSE2的可行性
. net应用程序。
struct
包装对您有帮助吗?
总结一下:
我们认为让我们的代码直接使用SSE数学库太复杂了。所以我们有两个数学库。在高性能代码中使用SSE,这将在我们的c++代码中深入使用。另一个是没有SSE的实现,它将在所有的接口和不那么多的性能关键代码中使用。
这样我们可以用托管代码编译和链接所有东西,但仍然可以通过在真正重要的地方使用SSE代码来提高性能。
然而,如果编译器可以"看到"SSE的东西(例如,你只是在类中有一个__m128成员),那么用托管代码编译任何东西都是一场噩梦。你必须给每件事都加上很多包装纸。
我猜这只是c#和托管代码从未真正兼容过的用例。
无论如何,谢谢你的建议,它帮助我更清楚地了解问题。
顺便说一句,我使用fftw包装器调用fftw方法进行内存分配,然后将数据填充在托管代码中,然后再次调用fftw进行处理。你能使用类似的范例吗?