c# - 通过编写 C dll 来加速 C# 中的数学代码?

标签 c# .net c performance

我有一个非常大的嵌套 for 循环,其中对 float 执行一些乘法和加法。

for (int i = 0; i < length1; i++)
{
    double aa = 0;
    for(int h = 0; h < 10; h++)
    {
       aa += omega[i][outsideGeneratedAddress[h]];
    }

    double alphaOld = alpha;
    alpha = Math.Sqrt(alpha * alpha + aa * aa);

    s = -aa / alpha;
    c = alphaOld / alpha;

    for(int j = 0; j <= i; j++)
    {
        double oldU = u[j];
        u[j] = c * oldU + s * omega[i][j];
        omega[i][j] = c * omega[i][j] - s * oldU;
    }
}

这个循环占用了我大部分的处理时间,是一个瓶颈。

如果我用 C 重写这个循环并从 C# 连接到它,我是否会看到任何速度提升?

编辑:我更新了代码以显示 s 和 c 是如何生成的。此外,内部循环实际上是从 0 到 i,尽管它可能对问题没有太大影响

EDIT2:我在 VC++ 中实现了该算法,并通过 dll 将其与 C# 链接,并且在启用所有优化后,速度比 C# 提高了 28%。启用 SSE2 的论点特别有效。使用 MinGW 和 gcc4.4 编译只提供了 15% 的速度提升。刚刚试用了英特尔编译器,发现这段代码的速度提高了 49%。

最佳答案

更新:

如果您编写内部循环以考虑引用的局部性,会发生什么情况:

for (int i = 0; i < length1; i++) 
{ 
    s = GetS(i); 
    c = GetC(i); 
    double[] omegaTemp = omega[i]; 

    for(int j = 0; j < length2; j++) 
    { 
        double oldU = u[j]; 
        u[j] = c * oldU + s * omegaTemp[j]; 
        omegaTemp[j] = c * omegaTemp[j] - s * oldU; 
    } 
} 

关于c# - 通过编写 C dll 来加速 C# 中的数学代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2901490/

相关文章:

c# - 通过 ServiceProxy 访问无状态服务失败 + ASP.NET 5 Web API 项目抛出健康状态错误

.net - 诊断.NET中的内存泄漏的工具(ASP.NET应用程序)

c - 为什么打包不能跨同级 union 或结构工作

c# - Ecma-334 是否对下一行(C# ECMA 标准)的描述不正确?

c# ProcessStartInfo.Start - 读取输出但超时

c# - NUnit测试调试

C:排序方法分析

c# - 如何将字符串发送到另一个窗口?

.net - Lazy<T> 重新初始化方法?

c - 这个算法属于哪种递归解析?自下而上还是自上而下?