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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6142|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:186175 發(fā)表于 2017-4-5 08:50 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
高斯消去法SSE并行化研究報(bào)告
一、         問(wèn)題描述
題目:高斯消去法(LU分解)串行算法如下面?zhèn)未a所示,計(jì)算模式如圖1所示(第k步時(shí)第k行的除法運(yùn)算,和后續(xù)行減去第k行的運(yùn)算)。設(shè)計(jì)實(shí)現(xiàn)SSE算法,加速計(jì)算過(guò)程。提交研究報(bào)告(問(wèn)題描述、SSE算法設(shè)計(jì)與實(shí)現(xiàn)、實(shí)驗(yàn)及結(jié)果分析)和源碼(只將程序文件和工程文件提交,不要將編譯出的目標(biāo)文件和可執(zhí)行文件也打包提交)。
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
綜合以上分析一下,作業(yè)的目的就是找到上面的算法可以并行執(zhí)行的部分,將這部分用SSE實(shí)現(xiàn),并且測(cè)試所用時(shí)間,再改變問(wèn)題規(guī)模,觀察隨著問(wèn)題規(guī)模的變化,所用時(shí)間與串行時(shí)間比例的變化。最后分析一下判斷并行算法的性能是否足夠好。
二、         SSE算法設(shè)計(jì)和實(shí)現(xiàn)
算法設(shè)計(jì):
分析此算法,首先外層循環(huán)無(wú)法并行化,因?yàn)樵诓煌难h(huán)中,相同位置的元素都會(huì)改變。內(nèi)部的將對(duì)角線元素變?yōu)?和下面元素變?yōu)?都是可以并發(fā)執(zhí)行的。由此獲得解題思路。但是在實(shí)際操作的工程中發(fā)現(xiàn)并行運(yùn)行時(shí)間有時(shí)候要比串行運(yùn)行時(shí)間多,所以又進(jìn)行了部分并行(只對(duì)置零操作進(jìn)行并行),發(fā)現(xiàn)有時(shí)候要比全部并行的效果好。
實(shí)現(xiàn):
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為單位進(jìn)行循環(huán)
              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為單位進(jìn)行循環(huán)
              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;
         }
     }
}
三、         實(shí)驗(yàn)及結(jié)果分析
  
矩陣規(guī)模
  
10
100
1000
512
1024
串行運(yùn)行時(shí)間
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
注:實(shí)驗(yàn)結(jié)果為每次運(yùn)行5次程序取平均值
根據(jù)實(shí)驗(yàn)數(shù)據(jù)繪制以下圖表:
從圖表中可以明顯看出來(lái),在運(yùn)算的數(shù)據(jù)較少的時(shí)候,并行算法和串行算法的速率幾乎沒(méi)有區(qū)別,串行算法甚至比并行算法快。但是隨著數(shù)據(jù)量的增長(zhǎng),可以明顯看到并行速度要比串行的速度快很多。注意其中的數(shù)據(jù)量為512和1024的位置,要比之前快的還要明顯。尤其是數(shù)據(jù)量為1000和1024的對(duì)比。說(shuō)明當(dāng)數(shù)據(jù)量為4的整數(shù)倍的時(shí)候,SSE并行算法發(fā)揮的用更大一些。
這張圖中看的更明顯一些。在數(shù)據(jù)量為512的時(shí)候,速率比要比在1000的時(shí)候高。當(dāng)數(shù)據(jù)量為1024的時(shí)候,只是比1000多了24個(gè)數(shù)據(jù),但是速率明顯的提升了。
從圖中可以看出,在數(shù)據(jù)量為1000左右的時(shí)候,部分并行是要快于全部并行的。
總結(jié):
此并行算法對(duì)串行算法進(jìn)行了性能上的優(yōu)化。在數(shù)據(jù)量越來(lái)越多的時(shí)候,優(yōu)化的效果也越來(lái)越好。并且當(dāng)數(shù)據(jù)量為4的整數(shù)倍的時(shí)候,優(yōu)化效果尤其明顯。
附加:
在做完實(shí)驗(yàn)之后,我在想并行算法中,如果先處理大部分?jǐn)?shù)據(jù),之后處理小于4個(gè)的數(shù)據(jù),效率會(huì)不會(huì)有變化,所以添加了以下實(shí)驗(yàn):
  
矩陣規(guī)模
  
10
100
1000
512
1024
先算4的倍數(shù)個(gè)數(shù)據(jù)
0.0315734ms
1.53941ms
1581.11ms
291.542ms
1505ms
后算4的倍數(shù)個(gè)數(shù)據(jù)
0.00384ms
1.59957ms
1288.09ms
247.643ms
1383.1ms
前者/后者
8.222
0.962
1.223
1.177
1.090
觀察可以看到,除了在數(shù)據(jù)過(guò)小的時(shí)候結(jié)果有一些偏差以外,其他情況兩種并行算法的方式都是差不多的。但同時(shí)可以看出來(lái)先處理大部分?jǐn)?shù)據(jù)再處理小部分?jǐn)?shù)據(jù)要快一些。
在全部完成后,使用codeblock重復(fù)以上實(shí)驗(yàn)步驟,使用了-O2加速(因?yàn)?O3本身采取的就是SSE方式,所以采用了-O2加速)。
得到如下實(shí)驗(yàn)結(jié)果:
  
矩陣規(guī)模
  
10
100
1000
512
1024
串行運(yùn)行時(shí)間
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
得到以下圖表:
  
從表格和圖表中可以看出,在數(shù)據(jù)較小的時(shí)候,由于并行本身的花銷(xiāo),串行算法要優(yōu)于并行算法。隨著數(shù)據(jù)量的增加,串行算法的運(yùn)行時(shí)間線性增加,但并行算法的固定開(kāi)銷(xiāo)卻是穩(wěn)定在一定范圍內(nèi)的,甚至在數(shù)據(jù)量達(dá)到一定規(guī)模的時(shí)候,這個(gè)開(kāi)銷(xiāo)可以忽略。所以時(shí)間比越來(lái)越大,最后甚至大于三倍。再看部分并行和全部并行。在數(shù)據(jù)量處于中間范圍的時(shí)候,可以看出部分并行要比全部并行的加速比大,推測(cè)還是并行開(kāi)銷(xiāo)的問(wèn)題。當(dāng)數(shù)據(jù)量逐漸增加的時(shí)候,在圖中可以看出在數(shù)據(jù)量大于1000的時(shí)候,全部并行的加速比要大于部分并行的加速比。以后可以根據(jù)數(shù)據(jù)規(guī)模選擇并行程度。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧洲av一区 | 亚洲不卡在线观看 | 天堂男人av | 精品99久久久久久 | 日本在线一区二区 | 日本久久精品 | 欧美999| 亚洲自拍一区在线观看 | 99精品国产一区二区青青牛奶 | 亚洲国产精品99久久久久久久久 | 国产一级片免费视频 | 91精品成人久久 | 国产高清视频一区 | 中文字幕在线免费观看 | 蜜桃综合在线 | 欧洲妇女成人淫片aaa视频 | 人人爽人人爽 | 欧美一区二区三区四区在线 | 亚洲免费网站 | 久久久xxx| 日韩精品一区二区三区老鸭窝 | 精品一区二区三区在线观看 | 麻豆精品一区二区三区在线观看 | 婷婷成人在线 | 成人国内精品久久久久一区 | 福利社午夜影院 | 一区二区三区四区国产 | 另类 综合 日韩 欧美 亚洲 | 激情伊人网 | 欧美激情精品久久久久久变态 | 国产精品二区三区在线观看 | 免费a v网站 | 中文字幕精品一区二区三区在线 | 日韩一区二区三区在线 | 日韩av免费在线观看 | 在线免费观看成年人视频 | 美女视频h | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 日韩精品一区二区三区老鸭窝 | 日韩欧美国产精品一区二区 | 婷婷国产一区二区三区 |