单声道C#/C 互动,优化矩阵乘法 - 开销引起的最小增益

Mono C#/C++ Interop, optimizing matrix multiplications - minimal gain due to overhead?

本文关键字:开销 声道 优化 互动 单声道      更新时间:2023-10-16

i在C#上具有一个矩阵结构,而无需使用SSE Intrinsics就实现了乘法操作。由于我目前无法访问代码,因此我将尽力指定详细信息,而不是复制/粘贴定义。我可以在早上编辑帖子,以包括相关定义。

结构有16 float s定义为M11, M12, M13, ..., M43, M44',并指定了顺序布局:[StructLayout(LayoutKind.Sequential)]

使用属性规范声明C 功能 [DllImport("cppCode.dll", EntryPoint = "MatrixMultiply", CallingConvention = CallingConvention::Cdecl]

我正在尝试使用P/Indoke来调用C 函数,以优化乘法。我的问题是关于传递参数。如MSDN所述,如果经过的类型不可粘于CPU 编组的成本为10至30个周期。

c#上的函数调用看起来像

MatrixMultiply(ref matrix1, ref matrix2, out matrix_out);

和C 对应物用mat*接收它们,而mat是匹配的C 结构,带有4x vec4s。

static extern void MatrixMultiply(mat* m1, mat* m2, mat* out) { *out = *m1 * *m2; }

当计算得分时,平均情况下的增益非常小 - 微秒或两个。但是,最坏的情况变得更糟,从150US的C#乘法到400US,带有C 乘法,这使我认为从导出的DLL调用功能的开销几乎消除了SSE指令的增益。

由于我对C#的熟悉程度有限,因此我无法确定发生了什么。难道我做错了什么?在这种情况下,C#/C 通信的方法更快吗?

如果数字无法提供足够好的解决方案,则最好的选择是最小化P/Invoke调用。不用为每次乘法调用Multiply(m1, m2, m_out),而是尝试在可能的情况下在C 侧的一个呼叫中加入矩阵:

void MatrixConcat3(m1, m2, m3, m_out);
void MatrixConcat4(m1, m2, m3, m4, m_out);
void MatrixConcat5(m1, m2, m3, m4, m5, m_out);
...

可以减少多次呼叫的开销。