在托管代码中调用SSE代码(对齐)
Calling SSE code in managed code (alignment)
我的问题是:我们有一个用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进行处理。你能使用类似的范例吗?
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 如何减少代码的运行时间以对齐文本?
- 可以处理复杂列对齐的代码格式化程序
- 如何将括号与其包含的代码对齐
- SSE 向量的对齐和未对齐加载和存储 - 如何减少代码重复
- 我不明白在下面的代码中将 char buffer[] 与 X 类型的对象对齐的原因
- AVX矢量化代码中的分段故障,GCC __attribute__对齐为32字节
- 在Visual Studio中对齐代码/代码边距
- 这个代码会使这些向量对齐吗
- 在托管代码中调用SSE代码(对齐)
- Android OpenCV -转换OpenCV c++代码到Android,以检测QR码对齐方块