并行程序设计实验——高斯消元

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

并行程序设计实验——高斯消元

一、问题描述

熟悉高斯消元法解线性方程组的过程,然后实现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];
        }
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值