单声道C#/C 互动,优化矩阵乘法 - 开销引起的最小增益
Mono C#/C++ Interop, optimizing matrix multiplications - minimal gain due to overhead?
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 vec4
s。
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);
...
可以减少多次呼叫的开销。
- 实现无开销push_back的最佳方法是什么
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- 类型擦除的std::function与虚拟函数调用的开销
- 一组值的零开销下标运算符
- C++ 特征库:引用的性能开销<>
- C++对开销较少的容器使用多个过滤器
- 在编译时评估函数开销的通用方法
- 在循环中调用同一虚函数的开销
- 使用静态成员函数而不是普通函数是否有任何开销?
- 自定义运算符重载C++,无开销
- 如何使用 ALSA API 在应用程序中在单声道和立体声之间切换声音输出?
- 在 v8 JavaScript 中重复调用C++是否有巨大的开销?
- 将 mmap 内存用于开销非常低的循环缓冲区
- 与纯 V8 相比,NodeJS 是否有任何性能缺陷或显著开销?
- 将具有嵌入式单声道的 C++ 函数指针传递给 C#
- 非 constexpr 变量模板的开销是否为零?
- 右值引用是否具有与右值引用相同的开销?
- 实例成员与静态成员与非类方法的开销
- 单声道C#/C 互动,优化矩阵乘法 - 开销引起的最小增益