提问人:PeRaDi 提问时间:10/17/2023 更新时间:10/17/2023 访问量:83
无法在不丢失输出的情况下使用 Loop 展开优化循环
Can't optimize loops with Loop unrolling without losing my output
问:
我正在尝试使用循环展开技术将这个函数优化到极限,但我无法弄清楚为什么我的方法会从原始函数修改我的输出(矩阵“a”)。
现在我正在尝试在每个循环中步入 2。谁能帮我解决这个问题? (这是一个取自git/FoleyLab/MolecularDynamics/的C++程序,这是一个简单的分子动力学程序,用于模拟伦纳德-琼斯粒子的真实气体特性)
**原有功能: **
void computeAccelerations()
{
int i, j, k;
double f, rSqd, rSqd4, rSqd7;
double result1, result2, result3;
double rij[3]; // position of i relative to j
for (i = 0; i < N; i++)
{
a[i][0] = 0;
a[i][1] = 0;
a[i][2] = 0;
}
for (i = 0; i < N - 1; i++)
{
for (j = i + 1; j < N; j++)
{
result1 = r[i][0] - r[j][0];
result2 = r[i][1] - r[j][1];
result3 = r[i][2] - r[j][2];
rSqd = result1 * result1 + result2 * result2 + result3 * result3;
rSqd4 = rSqd * rSqd * rSqd * rSqd;
rSqd7 = rSqd4 * rSqd * rSqd * rSqd;
f = 24 * (2 / rSqd7 - 1 / rSqd4);
a[i][0] += result1 * f;
a[j][0] -= result1 * f;
a[i][1] += result2 * f;
a[j][1] -= result2 * f;
a[i][2] += result3 * f;
a[j][2] -= result3 * f;
}
}
}
**我的方法: **
void computeAccelerations()
{
int i, j, k;
double f, rSqd, rSqd4, rSqd7;
double result1, result2, result3, result4, result5, result6;
double rij[6]; // position of i relative to j
for (i = 0; i < N; i++)
{
a[i][0] = 0;
a[i][1] = 0;
a[i][2] = 0;
}
for (i = 0; i < N - 1; i += 2)
{
for (j = i + 1; j < N; j += 2)
{
result1 = r[i][0] - r[j][0];
result2 = r[i][1] - r[j][1];
result3 = r[i][2] - r[j][2];
rSqd = result1 * result1 + result2 * result2 + result3 * result3;
rSqd4 = rSqd * rSqd * rSqd * rSqd;
rSqd7 = rSqd4 * rSqd * rSqd * rSqd;
f = 24 * (2 / rSqd7 - 1 / rSqd4);
a[i][0] += result1 * f;
a[j][0] -= result1 * f;
a[i][1] += result2 * f;
a[j][1] -= result2 * f;
a[i][2] += result3 * f;
a[j][2] -= result3 * f;
result4 = r[i + 1][0] - r[j + 1][0];
result5 = r[i + 1][1] - r[j + 1][1];
result6 = r[i + 1][2] - r[j + 1][2];
rSqd = result4 * result4 + result5 * result5 + result6 * result6;
rSqd4 = rSqd * rSqd * rSqd * rSqd;
rSqd7 = rSqd4 * rSqd * rSqd * rSqd;
f = 24 * (2 / rSqd7 - 1 / rSqd4);
a[i + 1][0] += result4 * f;
a[j + 1][0] -= result4 * f;
a[i + 1][1] += result5 * f;
a[j + 1][1] -= result5 * f;
a[i + 1][2] += result6 * f;
a[j + 1][2] -= result6 * f;
}
}
}
答: 暂无答案
评论
N
N
pragma
rSqd * rSqd * rSqd * rSqd
(rSqd * rSqd) * (rSqd * rSqd)
rSqd7
24 * (2 / rSqd7 - 1 / rSqd4)
(24 * 2) / rSqd7 - 24 / rSqd4
(x, y, z)