久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6184|回復: 0
收起左側

高斯消去法(LU分解)SSE并行化研究報告 帶源代碼

[復制鏈接]
ID:186175 發表于 2017-4-5 08:50 | 顯示全部樓層 |閱讀模式
高斯消去法SSE并行化研究報告
一、         問題描述
題目:高斯消去法(LU分解)串行算法如下面偽代碼所示,計算模式如圖1所示(第k步時第k行的除法運算,和后續行減去第k行的運算)。設計實現SSE算法,加速計算過程。提交研究報告(問題描述、SSE算法設計與實現、實驗及結果分析)和源碼(只將程序文件和工程文件提交,不要將編譯出的目標文件和可執行文件也打包提交)。
1.procedure LU (A)
2. begin
3.    for k := 1 to n do
4.           for j := k+1 to n do
5.                  A[k, j] := A[k, j]/A[k, k];
6            A[k, k] := 1.0;
7.           endfor;
8.           for i := k + 1 to n do
9.                  for j := k + 1 to n do
10.                       A[i, j] := A[i, j] - A[i,k] × A[k, j ];
11.         endfor;
12.         A[i, k] := 0;
13.  endfor;
14.endfor;
15. end LU
綜合以上分析一下,作業的目的就是找到上面的算法可以并行執行的部分,將這部分用SSE實現,并且測試所用時間,再改變問題規模,觀察隨著問題規模的變化,所用時間與串行時間比例的變化。最后分析一下判斷并行算法的性能是否足夠好。
二、         SSE算法設計和實現
算法設計:
分析此算法,首先外層循環無法并行化,因為在不同的循環中,相同位置的元素都會改變。內部的將對角線元素變為1和下面元素變為0都是可以并發執行的。由此獲得解題思路。但是在實際操作的工程中發現并行運行時間有時候要比串行運行時間多,所以又進行了部分并行(只對置零操作進行并行),發現有時候要比全部并行的效果好。
實現:
1)          基本串行算法:
voidbasic_change() {//基本的串行算法
     for (int k =0; k < MAX; k++)
     {
         for (int j =k; j < MAX; j++)
              A[k][j] /= A[k][k];
         A[k][k] = 1;
         for (int i =k + 1; i < MAX; i++)
          {
              for (int j =k + 1; j < MAX; j++)
                   A[ i][j] = A[ i][j] - A[ i][k] *A[k][j];
              A[ i][k] = 0;
         }
     }
}
2)          并行算法:
voidpara_change_impr() {//并行算法
     __m128 t1,t2, t3;
     for (int k =0; k < MAX; k++)
     {
//此處需要并行處理
         int off= (MAX - k - 1) % 4;
         for (int j =k + 1; j < k + 1 + off; j++)
              A[k][j] /= A[k][k];
         t2=_mm_loadu_ps(A[k] + k);
         for (int j =k + 1 + off; j < MAX; j += 4)
         {
              t1 =_mm_loadu_ps(A[k] + j);
              t1 =_mm_div_ps(t1,t2);
              _mm_store_ss(A[k] + j, t1);
         }
         A[k][k] = 1;
         for (int i =k + 1; i < MAX; i++)
         {
              //此處不再以1位單位而是以4為單位進行循環
              for (int j =k + 1; j < k + 1 + off; j++)
                   A[ i][j] = A[ i][j] - A[ i][k] *A[k][j];
              for (int j =k + 1 + off; j < MAX; j += 4)
              {
                   t2 =_mm_loadu_ps(A[ i] + k);
                   t3 =_mm_loadu_ps(A[k] + j);
                   t1 =_mm_loadu_ps(A[ i] + j);
                   t2 =_mm_mul_ps(t2, t3);
                   t1 =_mm_sub_ps(t1, t2);
                   _mm_store_ss(A[ i] + j, t1);
              }
              A[ i][k] = 0;
         }
     }
}
3)          部分并行:
voidpara_change() {//并行算法
     __m128 t1,t2, t3;
     for (int k =0; k < MAX; k++)
     {
         for (int j =k + 1; j < MAX; j++)
              A[k][j] /= A[k][k];
         A[k][k] = 1;
         //此處需要并行處理
         for (int i =k + 1; i < MAX; i++)
         {
              //此處不再以1位單位而是以4為單位進行循環
              int off= (MAX - k - 1) % 4;
              for (int j =k + 1; j < k + 1 + off; j++)
                   A[ i][j] = A[ i][j] - A[ i][k] *A[k][j];
              for (int j =k + 1 + off; j < MAX; j += 4)
              {
                   t2 =_mm_loadu_ps(A[ i] + k);
                   t3 =_mm_loadu_ps(A[k] + j);
                   t1 =_mm_loadu_ps(A[ i] + j);
                   t2 =_mm_mul_ps(t2, t3);
                   t1 =_mm_sub_ps(t1, t2);
                   _mm_store_ss(A[ i] + j, t1);
              }
              A[ i][k] = 0;
         }
     }
}
三、         實驗及結果分析
  
矩陣規模
  
10
100
1000
512
1024
串行運行時間
0.0030ms
1.8973ms
1794.62ms
343.542ms
2707.7ms
部分并行
0.0316ms
1.5394ms
1581.11ms
  
291.542ms
1505ms
并行
0.8534ms
2.5583ms
1831.7ms
156.443ms
1471.66ms
串行/部分并行
0.094937
1.232493
1.135038
1.178362
0.179914
串行/
  
并行
0.003515
0.741625
0.979757
2.195956
1.839895
注:實驗結果為每次運行5次程序取平均值
根據實驗數據繪制以下圖表:
從圖表中可以明顯看出來,在運算的數據較少的時候,并行算法和串行算法的速率幾乎沒有區別,串行算法甚至比并行算法快。但是隨著數據量的增長,可以明顯看到并行速度要比串行的速度快很多。注意其中的數據量為512和1024的位置,要比之前快的還要明顯。尤其是數據量為1000和1024的對比。說明當數據量為4的整數倍的時候,SSE并行算法發揮的用更大一些。
這張圖中看的更明顯一些。在數據量為512的時候,速率比要比在1000的時候高。當數據量為1024的時候,只是比1000多了24個數據,但是速率明顯的提升了。
從圖中可以看出,在數據量為1000左右的時候,部分并行是要快于全部并行的。
總結:
此并行算法對串行算法進行了性能上的優化。在數據量越來越多的時候,優化的效果也越來越好。并且當數據量為4的整數倍的時候,優化效果尤其明顯。
附加:
在做完實驗之后,我在想并行算法中,如果先處理大部分數據,之后處理小于4個的數據,效率會不會有變化,所以添加了以下實驗:
  
矩陣規模
  
10
100
1000
512
1024
先算4的倍數個數據
0.0315734ms
1.53941ms
1581.11ms
291.542ms
1505ms
后算4的倍數個數據
0.00384ms
1.59957ms
1288.09ms
247.643ms
1383.1ms
前者/后者
8.222
0.962
1.223
1.177
1.090
觀察可以看到,除了在數據過小的時候結果有一些偏差以外,其他情況兩種并行算法的方式都是差不多的。但同時可以看出來先處理大部分數據再處理小部分數據要快一些。
在全部完成后,使用codeblock重復以上實驗步驟,使用了-O2加速(因為-O3本身采取的就是SSE方式,所以采用了-O2加速)。
得到如下實驗結果:
  
矩陣規模
  
10
100
1000
512
1024
串行運行時間
0.00298666ms
2.39232ms
1230.66ms
212.315ms
1349.82ms
部分并行
0.00341333ms
0.707839ms
391.611ms
  
66.3569ms
462.897ms
并行
0.0136533ms
1.05472ms
471.08ms
64.1954ms
359.968ms
串行/部分并行
0.874999
3.379752
3.142557
3.199592
2.916027
串行/
  
并行
0.21875
2.268204
2.612423
3.307324
3.749833
得到以下圖表:
  
從表格和圖表中可以看出,在數據較小的時候,由于并行本身的花銷,串行算法要優于并行算法。隨著數據量的增加,串行算法的運行時間線性增加,但并行算法的固定開銷卻是穩定在一定范圍內的,甚至在數據量達到一定規模的時候,這個開銷可以忽略。所以時間比越來越大,最后甚至大于三倍。再看部分并行和全部并行。在數據量處于中間范圍的時候,可以看出部分并行要比全部并行的加速比大,推測還是并行開銷的問題。當數據量逐漸增加的時候,在圖中可以看出在數據量大于1000的時候,全部并行的加速比要大于部分并行的加速比。以后可以根據數據規模選擇并行程度。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品一区二区三区四区视频 | 国产精品久久久久久一区二区三区 | 日本国产欧美 | 日韩资源| 99久久免费精品国产免费高清 | 久久久久久一区 | 日韩精品免费在线观看 | 看片天堂| 91精品国产一区二区在线观看 | 成人激情视频网 | 国产一区二区三区久久久久久久久 | 日韩一二区在线观看 | 欧美一区在线视频 | 国产精品美女久久久久久免费 | 欧美综合视频 | 精品日韩一区 | 色接久久| 国产精品高潮呻吟久久久久 | 99re热精品视频 | 热99| 久久另类 | 亚洲精品久 | 91九色在线观看 | 精品在线视频播放 | 黄色一级电影在线观看 | 在线日韩 | 国产japanhdxxxx麻豆 | 国产乱码精品一区二区三区中文 | 久久久久久久久久久高潮一区二区 | 一区二区三区视频在线观看 | 91精品久久久久久久久久入口 | 青青久草 | 九九精品在线 | 免费黄色a级毛片 | 日韩精品免费看 | 国产伦精品一区二区三毛 | 国产成人精品视频 | 欧美一区二区免费 | 夜夜操操操 | 国产精品免费视频一区 | 久久久久久国产精品免费免费狐狸 |