繁体   English   中英

Mono C#/ C ++ Interop,优化矩阵乘法-由于开销而获得的最小收益?

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

我在C#上有一个矩阵结构,其中的乘法运算是在不使用SSE内部函数的情况下实现的。 由于我目前无法访问代码,因此我将尽我所能指定详细信息,而不是复制/粘贴定义。 如果需要,我可以在早上编辑帖子以包含相关定义。

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

C ++函数用属性规范[DllImport("cppCode.dll", EntryPoint = "MatrixMultiply", CallingConvention = CallingConvention::Cdecl]

我正在尝试使用P / Invoke调用C ++函数来优化乘法。 我的问题是关于传递参数。 如在MSDN上所提到的,如果传递的类型不可拆分,则成本为10到30个CPU +编组周期。

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

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

而C ++对方则通过mat*接收它们,其中mat是带有4x vec4的匹配C ++结构。

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

分析计算结果后,平均情况下的增益非常小-一微秒或两秒。 但是,最坏的情况变得更糟,从使用C#乘法的150us到使用C ++乘法的400us,这使我认为从导出的dll调用函数的开销几乎消除了SSE指令的收益。

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

如果数字不能提供足够好的解决方案,那么最好的选择是将p / Invoke调用减到最少。 不要Multiply(m1, m2, m_out)每次乘法Multiply(m1, m2, m_out)调用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);
...

这将减少进行多个呼叫的开销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM