我有一个非常大的嵌套 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/