Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单声道C#/C++;互操作,优化矩阵乘法-由于开销导致的最小增益?_C#_C++_Optimization_Mono_Pinvoke - Fatal编程技术网

单声道C#/C++;互操作,优化矩阵乘法-由于开销导致的最小增益?

单声道C#/C++;互操作,优化矩阵乘法-由于开销导致的最小增益?,c#,c++,optimization,mono,pinvoke,C#,C++,Optimization,Mono,Pinvoke,我在C#上有一个矩阵结构,其中的乘法操作是在不使用SSE内部函数的情况下实现的。由于我目前无法访问代码,我将尽可能详细地指定细节,而不是复制/粘贴定义。如果需要的话,我可以在早上编辑这篇文章,包括相关的定义 结构有16个floats,定义为M11、M12、M13、…、M43、M44',并指定了顺序布局:[StructLayout(LayoutKind.sequential)] 用属性说明声明C++函数 [DllImport(“cppCode.dll”,EntryPoint=“MatrixMult

我在C#上有一个矩阵结构,其中的乘法操作是在不使用SSE内部函数的情况下实现的。由于我目前无法访问代码,我将尽可能详细地指定细节,而不是复制/粘贴定义。如果需要的话,我可以在早上编辑这篇文章,包括相关的定义

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

用属性说明声明C++函数

[DllImport(“cppCode.dll”,EntryPoint=“MatrixMultiply”,CallingConvention=CallingConvention::Cdecl]

我试图用P/Unjk调用C++函数来优化乘法。我的问题是传递参数。正如MSDN所提到的,如果传递的类型不是BLTTABLE,则成本是10到30个周期的CPU +编组。 C#上的函数调用如下所示

MatrixMultiply(ref matrix1, ref matrix2, out matrix_out);
<> > C++对应的对象是“代码> Matt*/CODE >,<代码> Mat < /Cord>是匹配的C++结构,具有4x<代码> VEC4< /代码> S.<
static extern void MatrixMultiply(mat* m1, mat* m2, mat* out) { *out = *m1 * *m2; }

计算时,平均增益为微秒级,平均值为1/2,但最坏情况恶化,从150乘以C乘法到400乘以C++乘法,这使我认为从导出DLL调用函数的开销几乎消除了SSE指令的增益。奥斯


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

如果数字不能提供足够好的解决方案,最好是最小化p/Invoke调用。而不是调用
乘法(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);
...

这将减少多次调用的开销。

您可以使用使用SIMD的类型。甚至还有一个
Matrix4x4
类。@cubrr-我已经检查了反汇编以确保-它现在在向量上。所以我尝试将C#矩阵存储为4 SIMD:Vec4,并以简单的方式实现矩阵乘法。不是吗还有时间分析(所以我明天肯定会知道它是否更快),但我希望使用原始实现使用的相同的原始矩阵乘法可以获得更好的性能,因为我们将使用SIMD寄存器。嗯,这太令人失望了