并行程序设计实验——高斯消元
一、问题描述
熟悉高斯消元法解线性方程组的过程,然后实现SSE算法编程。过程中,自行构造合适的线性方程组,并选取至少2个角度,讨论不同算法策略对性能的影响。
可选角度包括但不限于以下几种选项:
①相同算法对于不同问题规模的性能提升是否有影响,影响情况如何;
②消元过程中采用向量编程的的性能提升情况如何;
③回代过程可否向量化,有的话性能提升情况如何;
④数据对齐与不对齐对计算性能有怎样的影响;
⑤SSE编程和AVX编程性能对比。

二、算法设计与实现
I. 串行消元算法实现
由于高斯消元有行主消元和列主消元两种形式,为了算法的运行效率,这里我采用的是行主消元
1. 用高斯消元法则实现普通串行消元算法的设计,时间复杂度 O ( n 3 ) O(n^3) O(n3)
/**
* 串行消元,这里加上了"等于号"后面的值这一列,便于求值,所以a的行是n,列是n+1
* @param n 矩阵规模
* @param a 将要消的矩阵
*/
void LU(int n, float a[][maxN]) {
//依据上一行的数值进行消元
for (int i = 0; i < n - 1; ++i) {
//遍历一下所有行,将前i个都置为0
for (int j = i + 1; j < n; ++j) {
//求出相差倍数
float temp = a[j][i] / a[i][i];
//遍历这一行的所有值,将i后面的数值依次减去相对应的值乘以倍数
for (int k = i + 1; k <= n; ++k) {
a[j][k] -= a[i][k] * temp;
}
//第i个为0
a[j][i] = 0.00;
}
}
}
2. 用高斯消元法之后的矩阵进行回代,则实现普通串行回代算法的设计,时间复杂度 O ( n 2 ) O(n^2) O(n2)
/**
* 回代函数,求出x的值
* @param n 未知数个数
* @param a 方程矩阵
* @param x 未知数的值数组
*/
void generation(int n, float a[][maxN], float x[]) {
//从最后一个未知数开始求,依次向上求解
for (int i = n - 1; i >= 0; --i) {
// 未知数等于"等于号"后面的值除以系数
x[i] = a[i][n] / a[i][i];
for (int j = i - 1; j >= 0; --j) {
// 求出x[i]后,依次代入上面的每一个方程,更新"等于号"后面的值
a[j][n] -= x[i] * a[j][i];
}
}

实验对比了串行与SSE算法在高斯消元法解线性方程组中的性能。串行消元和回代时间随着矩阵规模增大而增加,SSE算法在消元阶段表现优于串行,但在回代阶段因矩阵转置导致效率降低。不同算法策略对性能影响显著,尤其是在回代过程的向量化上。
659

被折叠的 条评论
为什么被折叠?



