精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

并行程序VS串行程序——優化實錄

開發 開發工具
透過MPI寫成一個并行排序程序,但其實這是一個偽并行程序,其實質還是一個串行程序。那么究竟該怎么對比他們呢?

  在多核處理器、超級計算機日益普及的今天,程序員們怎能對并行程序“袖手旁觀”呢?

  為了練手,我用MPI寫了一個并行排序程序,

  先介紹下我的第一個版本,大概的思路是:

  使用MPI在各個進程之間進行通信,

  1. 進程0生成隨機數,并且講數據分段,將各段數據分配給其他進程

  2. 其他進程收到數據段,使用冒泡排序進行,發送回進程0

  3. 進程0收到這些數據,通過歸并排序按順序整合起來。

  下面是這個版本代碼,

  1.   //MPI Hello World demo  
  2.   #include <mpi.h>  
  3.   #include <stdio.h>  
  4.   #include <stdlib.h>  
  5.   #include <time.h>  
  6.   #defineN 30  
  7.   intmain(intargc, char** argv)  
  8.   {  
  9.  intprocessRank, processNum, t, data, num;  
  10.   intdataArr[N];  
  11.   intdataArrB[N];  
  12.   intpointer[100];  
  13.   intsecEnd[100];  
  14.   MPI_Status mpistat;  
  15.   MPI_Init(&argc, &argv);  
  16.   MPI_Comm_size(MPI_COMM_WORLD, &processNum);  
  17.   MPI_Comm_rank(MPI_COMM_WORLD, &processRank);  
  18.   printf("Yes, Sir! From process %i of %i ", processRank, processNum);  
  19.   if(processRank == 0)  
  20.   {  
  21.   srand(time(NULL));  
  22.   for(inti = 0;i <N; i++){  
  23.   dataArr[i] = rand()%1000;  
  24.  }  
  25.   printf("Original Array: ");  
  26.   for(inti = 0;i< N; i++){  
  27.   printf("%d ", dataArr[i]);  
  28.   }  
  29.   printf(" ");  
  30.   puts("Distribute data to processes");  
  31.   for(inti = 1;i <processNum; i++){  
  32.   num = (N/(processNum-1));  
  33.  if(i == processNum -1)  
  34.   num = N - num * (processNum -2);  
  35.   ///distribute data to each process  
  36.   printf("Sending to process %d... ", i);  
  37.   MPI_Send(&num, 1, MPI_INT, i, 55, MPI_COMM_WORLD);  
  38.   MPI_Send(&dataArr[(N/(processNum-1)) * (i-1)], num, MPI_INT, i, 55, MPI_COMM_WORLD);  
  39.   ///gather the sorted data  
  40.   printf("Receiving from process %d... ", i);  
  41.   MPI_Recv(&dataArrB[(N/(processNum-1)) * (i-1)], num, MPI_INT, i, 55, MPI_COMM_WORLD, &mpistat);  
  42.   ///prepare for merge, set the pointers  
  43.   pointer[i] = (N/(processNum-1)) * (i-1);  
  44.   secEnd[i] = pointer[i] + N/(processNum-1);  
  45.   if(i == processNum-1) secEnd[i] = N;  
  46.   }  
  47.   printf("Sorted Sections Array: ");  
  48.   for(inti = 0;i< N; i++){  
  49.   printf("%d ", dataArrB[i]);  
  50.   }  
  51.   puts("");  
  52.   ///merge the sorted sections  
  53.   puts("Merging...");  
  54.   for(inti = 0;i <N; i++){  
  55.   inttMin = 1;  
  56.   intmin = 10000;  
  57.   for(t = 1;t <processNum; t++){  
  58.   if(pointer[t] <secEnd[t] &&dataArrB[pointer[t]] <min){  
  59.   min = dataArrB[pointer[t]];  
  60.   tMin = t;  
  61.   }  
  62.   }  
  63.   dataArr[i] = dataArrB[pointer[tMin]];  
  64.   pointer[tMin]++;  
  65.   }  
  66.   ///output the results  
  67.   printf("Final Sorted Array: ");  
  68.   for(inti = 0;i< N; i++){  
  69.   printf("%d ", dataArr[i]);  
  70.   }  
  71.   printf(" ");  
  72.   }  
  73.   else 
  74.   {  
  75.   //receieve the section  
  76.   MPI_Recv(&num, 1, MPI_INT, 0, 55, MPI_COMM_WORLD, &mpistat);  
  77.   MPI_Recv(&dataArr[0], num, MPI_INT, 0, 55, MPI_COMM_WORLD, &mpistat);  
  78.   printf("Received Original Array: ");  
  79.   for(inti = 0;i< num; i++){  
  80.   printf("%d ", dataArr[i]);  
  81.   }  
  82.   printf(" ");  
  83.   //sort this section  
  84.   for(inti = 0;i <num -1;i++)  
  85.   for(intj = num-1;j>=i+1;j--)  
  86.   if(dataArr[j] <dataArr[j-1]){  
  87.   inttmp = dataArr[j];  
  88.   dataArr[j]= dataArr[j-1];  
  89.   dataArr[j-1] = tmp;  
  90.   }  
  91.   MPI_Send(&dataArr[0], num, MPI_INT, 0, 55, MPI_COMM_WORLD);  
  92.   ///display  
  93.   printf("My Sorted Section: ");  
  94.   for(inti = 0;i< num; i++){  
  95.   printf("%d ", dataArr[i]);  
  96.   }  
  97.  printf(" ");  
  98.   }  
  99.   MPI_Finalize();  
  100.   return0;  
  101.   } 

  自己寫出之后當然高興,不過程序經過高手檢查之后,提出了一些問題。

  最要命的是這個

  1.   for(inti = 1;i <processNum; i++){  
  2.   num = (N/(processNum-1));  
  3.   if(i == processNum -1)  
  4.   num = N - num * (processNum -2);  
  5.   ///distribute data to each process  
  6.   printf("Sending to process %d... ", i);  
  7.   MPI_Send(&num, 1, MPI_INT, i, 55, MPI_COMM_WORLD);  
  8.   MPI_Send(&dataArr[(N/(processNum-1)) * (i-1)], num, MPI_INT, i, 55, MPI_COMM_WORLD);  
  9.   ///gather the sorted data  
  10.   printf("Receiving from process %d... ", i);  
  11.   MPI_Recv(&dataArrB[(N/(processNum-1)) * (i-1)], num, MPI_INT, i, 55, MPI_COMM_WORLD, &mpistat);  
  12.   ///prepare for merge, set the pointers  
  13.   pointer[i] = (N/(processNum-1)) * (i-1);  
  14.   secEnd[i] = pointer[i] + N/(processNum-1);  
  15.   if(i == processNum-1) secEnd[i] = N;  
  16.   } 

  這段程序徹底抹殺掉了我這個并行程序的光輝形象,因為這段煞有介事的并行程序,其實是一段串行程序。

  屏幕前的高手應該看出來了吧,同一段程序的收發,都在同一段循環中。

  也就意味著,不同段之間的收發是一個接著一個的。也就意味著,其他每個進程各自的排序也是一個接著一個進行的,并不會如我初衷并行排序。

  想來,這段錯誤應該是并行程序小白們常犯的錯誤,所以我也很樂于把我做過的蠢事發出來給大家分享。前車之鑒,警鐘長鳴lol

  改正之后的這段程序是這樣的,

  1.   for(inti = 1;i <processNum; i++){  
  2.   num = (N/(processNum-1));  
  3.   if(i == processNum -1)  
  4.   num = N - num * (processNum -2);  
  5.   ///distribute data to each process  
  6.   printf("Sending to process %d... ", i);  
  7.   MPI_Send(&num, 1, MPI_INT, i, 55, MPI_COMM_WORLD);  
  8.   MPI_Send(&dataArr[(N/(processNum-1)) * (i-1)], num, MPI_INT, i, 55, MPI_COMM_WORLD);  
  9.   }  
  10.   for(inti = 1;i <processNum; i++){  
  11.   num = (N/(processNum-1));  
  12.   if(i == processNum -1)  
  13.   num = N - num * (processNum -2);  
  14.   ///gather the sorted data  
  15.   printf("Receiving from process %d... ", i);  
  16.   MPI_Recv(&dataArrB[(N/(processNum-1)) * (i-1)], num, MPI_INT, i, 55, MPI_COMM_WORLD, &mpistat);  
  17.   ///prepare for merge, set the pointers  
  18.   pointer[i] = (N/(processNum-1)) * (i-1);  
  19.   secEnd[i] = pointer[i] + N/(processNum-1);  
  20.   if(i == processNum-1) secEnd[i] = N;  
  21.   } 

  同時程序的效率還可以提升,比如說把其他進程排序的算法換成快排什么的。

  最后奉上優化后的版本

  1.   //MPI Hello World demo  
  2.   #include <mpi.h>  
  3.   #include <stdio.h>  
  4.   #include <stdlib.h> //'qsort' is in it.  
  5.   #include <time.h>  
  6.   #include <map>  
  7.   #defineN 30  
  8.   intQuickSortCompareFun(constvoid*p1, constvoid*p2)  
  9.   {  
  10.   return*((constint*)p1) - *((constint*)p2);  
  11.   }  
  12.   intmain(intargc, char** argv)  
  13.   {  
  14.   intprocessRank, processNum, t, data, num;  
  15.   intdataArr[N];  
  16.   intdataArrB[N];  
  17.   intpointer[100];  
  18.   intsecEnd[100];  
  19.   MPI_Status mpistat;  
  20.   MPI_Init(&argc, &argv);  
  21.   MPI_Comm_size(MPI_COMM_WORLD, &processNum);  
  22.   MPI_Comm_rank(MPI_COMM_WORLD, &processRank);  
  23.   printf("Yes, Sir! From process %i of %i ", processRank, processNum);  
  24.   if(processRank == 0)  
  25.   {  
  26.   srand(time(NULL));  
  27.   for(inti = 0;i <N; i++){  
  28.   dataArr[i] = rand()%1000;  
  29.   }  
  30.   printf("Original Array: ");  
  31.  for(inti = 0;i< N; i++){  
  32.   printf("%d ", dataArr[i]);  
  33.   }  
  34.   printf(" ");  
  35.   puts("Distribute data to processes");  
  36.   for(inti = 1;i <processNum; i++){  
  37.   num = (N/(processNum-1));  
  38.   if(i == processNum -1)  
  39.   num = N - num * (processNum -2);  
  40.   ///distribute data to each process  
  41.   printf("Sending to process %d... ", i);  
  42.   MPI_Send(&num, 1, MPI_INT, i, 55, MPI_COMM_WORLD);  
  43.   MPI_Send(&dataArr[(N/(processNum-1)) * (i-1)], num, MPI_INT, i, 55, MPI_COMM_WORLD);  
  44.   }  
  45.   for(inti = 1;i <processNum; i++){  
  46.   num = (N/(processNum-1));  
  47.  if(i == processNum -1)  
  48.   num = N - num * (processNum -2);  
  49.   ///gather the sorted data  
  50.   printf("Receiving from process %d... ", i);  
  51.   MPI_Recv(&dataArrB[(N/(processNum-1)) * (i-1)], num, MPI_INT, i, 55, MPI_COMM_WORLD, &mpistat);  
  52.   ///prepare for merge, set the pointers  
  53.   pointer[i] = (N/(processNum-1)) * (i-1);  
  54.   secEnd[i] = pointer[i] + N/(processNum-1);  
  55.   if(i == processNum-1) secEnd[i] = N;  
  56.   }  
  57.   printf("Sorted Sections Array: ");  
  58.   for(inti = 0;i< N; i++){  
  59.   printf("%d ", dataArrB[i]);  
  60.   }  
  61.   puts("");  
  62.   ///merge the sorted sections  
  63.   puts("Merging...");  
  64.   std::map<intint>data2rank;  
  65.   for(t = 1;t <processNum; t++){  
  66.   if(pointer[t] <secEnd[t]){  
  67.   data2rank.insert(std::make_pair<intint>(dataArrB[pointer[t]], t));  
  68.   pointer[t]++;  
  69.   }  
  70.   }  
  71.   for(inti = 0;i <N; i++){  
  72.   intdata = data2rank.begin()->first;  
  73.   intrank = data2rank.begin()->second;  
  74.   dataArr[i] = data;  
  75.   data2rank.erase(data2rank.begin());  
  76.   if(pointer[rank] <secEnd[rank])  
  77.   {  
  78.   data2rank.insert(std::make_pair<intint>(dataArrB[pointer[rank]], rank));  
  79.   pointer[rank]++;  
  80.   }  
  81.   }  
  82.   ///output the results  
  83.   printf("Final Sorted Array: ");  
  84.   for(inti = 0;i< N; i++){  
  85.   printf("%d ", dataArr[i]);  
  86.   }  
  87.   printf(" ");  
  88.   }  
  89.   else 
  90.   {  
  91.   //receieve the section  
  92.   MPI_Recv(&num, 1, MPI_INT, 0, 55, MPI_COMM_WORLD, &mpistat);  
  93.   MPI_Recv(&dataArr[0], num, MPI_INT, 0, 55, MPI_COMM_WORLD, &mpistat);  
  94.   printf("Received Original Array: ");  
  95.   for(inti = 0;i< num; i++){  
  96.  printf("%d ", dataArr[i]);  
  97.   }  
  98.   printf(" ");  
  99.   //sort this section  
  100.   qsort(dataArr, num, sizeof(int), QuickSortCompareFun);  
  101.   MPI_Send(&dataArr[0], num, MPI_INT, 0, 55, MPI_COMM_WORLD);  
  102.   ///display  
  103.   printf("My Sorted Section: ");  
  104.   for(inti = 0;i< num; i++){  
  105.   printf("%d ", dataArr[i]);  
  106.   }  
  107.   printf(" ");  
  108.   }  
  109.   MPI_Finalize();  
  110.  return0; 

原文鏈接:http://www.cnblogs.com/rosting/archive/2011/11/16/2251892.html

[[50028]]

【編輯推薦】

  1. 微軟發布新版Windows 7及.NET 4軟件開發工具包
  2. 詳解.NET 4.0并行計算支持歷史
  3. 詳讀.NET 4.0環境配置
  4. 詳解.NET 4.0中異常處理方面的新特性
  5. 三方面詮釋.NET 4.0的新特性
責任編輯:彭凡 來源: 博客園
相關推薦

2013-12-16 16:58:47

OpenMP并行

2013-12-16 16:49:57

OpenMP

2012-03-12 12:34:02

JavaF#

2010-06-03 19:28:02

Hadoop

2020-02-26 09:42:15

主存程序存儲器

2013-05-14 10:53:41

AIR Android真機運行

2023-03-31 08:44:55

Go開發命令

2016-03-28 10:00:09

Swift命令程序

2019-04-16 06:50:34

2021-04-21 07:53:12

JavaScript單行程序

2012-04-26 13:36:30

iPhone運行程序

2010-07-15 10:58:23

Perl命令行程序

2021-04-19 11:30:06

Java開發程序

2010-02-26 13:03:31

Python腳本語言

2022-02-04 22:05:19

JVM程序內存模型

2011-09-19 19:21:54

linux

2013-05-14 10:41:31

2010-02-24 15:41:53

Python解釋器

2013-10-31 15:47:29

CloudaApp

2015-07-15 10:32:44

Node.js命令行程序
點贊
收藏

51CTO技術棧公眾號

无码一区二区三区在线| 三上悠亚久久精品| www.国产三级| 一区二区三区四区五区在线| 亚洲欧洲国产伦综合| 天天摸天天舔天天操| 四虎亚洲精品| 国产亚洲欧美激情| 国产精品久久久久久久久久久久午夜片 | 亚洲国产精品成人综合色在线婷婷| 国产欧美精品日韩精品| 日本一区二区三区免费视频| 日韩综合网站| 日韩国产一区三区| 香蕉视频xxxx| 亚洲综合av一区二区三区| 亚洲一本大道在线| 亚洲精品无人区| 五月激情婷婷网| 国产精品综合一区二区| 日韩av男人的天堂| 成年人午夜视频| 你懂的亚洲视频| 日韩中文字幕免费| 国产精品国产三级国产专业不| 中文在线综合| 91精品在线一区二区| 国产午夜福利100集发布| 国产黄色在线网站| 国产精品水嫩水嫩| 欧美日本国产精品| 日韩一卡二卡在线| 国产不卡免费视频| 91色琪琪电影亚洲精品久久| 中文字幕第2页| 久久一二三四| 日本人成精品视频在线| 999这里只有精品| 1024成人| 欧美激情在线狂野欧美精品| 日本a级片视频| 国产精品99在线观看| 国产亚洲激情在线| 91网站免费视频| 精品一区毛片| 亚洲性线免费观看视频成熟| 中文字幕在线看高清电影| 欧美国产不卡| 亚洲国产精品久久久久秋霞不卡| 亚洲成a人片在线www| 亚洲精品在线国产| 精品国一区二区三区| 国产清纯白嫩初高中在线观看性色| 国产不卡精品在线| 欧美一区二区福利视频| 久久久久久久久久久影视| 国产一区精品二区| 日韩欧美一区二区久久婷婷| 手机看片国产精品| 91精品啪在线观看国产爱臀| 亚洲成年网站在线观看| 国产精品无码永久免费不卡| 亚洲69av| 中文字幕国产精品久久| 欧美日韩午夜视频| 欧美激情aⅴ一区二区三区| 美乳少妇欧美精品| 日本一区二区三区免费视频| 免费在线观看成人av| 人体精品一二三区| 中文字幕丰满人伦在线| 国产一区欧美日韩| 国产精华一区| 毛片网站在线观看| 国产精品久久久久久久久晋中| 色哺乳xxxxhd奶水米仓惠香| 日本在线观看大片免费视频| 午夜在线电影亚洲一区| 国产乱子夫妻xx黑人xyx真爽| sese综合| 91精品国产综合久久精品app| 成年人看片网站| 人妖一区二区三区| 中文字幕欧美日韩va免费视频| 精品女人久久久| 激情欧美国产欧美| 国产精品久久久久久av| 99热这里只有精品99| heyzo一本久久综合| 日韩欧美电影一区二区| 羞羞视频在线免费国产| 一本色道久久综合精品竹菊| 福利视频999| 日本在线中文字幕一区| 日韩在线免费高清视频| 国产午夜精品无码一区二区| 日韩电影一区二区三区四区| www.成人av| 成a人片在线观看www视频| 一区二区三区欧美日| 麻豆av免费在线| 亚洲不卡在线| 亚洲网站视频福利| 久久久精品一区二区涩爱| 久久久久欧美精品| av电影成人| 91在线直播| 婷婷综合另类小说色区| 久久6免费视频| 蜜桃一区二区三区| 国模吧一区二区三区| 一卡二卡三卡在线| 久久精品夜夜夜夜久久| avav在线播放| 91精品麻豆| 亚洲欧美日韩精品久久奇米色影视 | 国产精品少妇在线视频| 日本在线成人| 日韩视频精品在线| 日韩欧美国产另类| 99re在线精品| 日本中文字幕亚洲| 日韩成人在线观看视频| 夜夜嗨av色一区二区不卡| 成人免费视频毛片| 成人黄色在线看| 97在线免费视频观看| 久久免费资源| 色综合伊人色综合网| 看黄色一级大片| 久久久欧美精品sm网站| 激情深爱综合网| 国产成人澳门| 久久久天堂国产精品女人| av天堂一区二区三区| 国产精品福利影院| 婷婷激情四射五月天| 国产99亚洲| 日本成熟性欧美| 日韩a在线看| 欧美午夜影院在线视频| 亚洲天堂网一区二区| 日韩午夜在线| 麻豆传媒一区| 亚洲欧美se| 亚洲欧美制服综合另类| 精品国产午夜福利| 国产农村妇女毛片精品久久麻豆 | 亚洲美女性生活视频| 久久国产黄色片| 久久夜色精品国产噜噜av| 免费观看精品视频| 精品在线99| 国产精品免费久久久久久| 91xxx在线观看| 欧美伦理视频网站| 国产波霸爆乳一区二区| 成人丝袜高跟foot| 成人一对一视频| 久久最新网址| 国产欧美一区二区三区四区| 在线观看黄av| 欧美一卡2卡3卡4卡| 久久久无码一区二区三区| 粉嫩蜜臀av国产精品网站| 久久久久久久久久网| 国产成人三级| 成人激情视频免费在线| 日本孕妇大胆孕交无码| 亚洲精品动漫100p| 日韩乱码一区二区三区| 亚洲人精品一区| 特级西西人体4444xxxx| 久久久夜夜夜| 丰满女人性猛交| 国产欧美三级电影| 国产成人涩涩涩视频在线观看| 欧美成人三区| 亚洲成人av片| 在线观看中文字幕网站| 亚洲精品国产一区二区三区四区在线| 一级少妇精品久久久久久久| 亚洲一级在线| 黄色网zhan| 婷婷精品在线| 成人av在线网址| 樱花草涩涩www在线播放| 主播福利视频一区| 人人妻人人玩人人澡人人爽| 在线观看日韩高清av| 九九视频免费看| 久久久久久免费网| 日本少妇一区二区三区| 首页国产欧美日韩丝袜| 国产专区在线视频| 凹凸成人精品亚洲精品密奴| 97在线电影| 成人在线免费av| 国精产品一区一区三区有限在线| 午夜视频在线看| 日韩国产在线播放| xxxx国产精品| 欧美三级韩国三级日本一级| 亚洲精品午夜久久久久久久| 中文字幕日本不卡| 欧美多人猛交狂配| 成人黄色一级视频| 91视频福利网| 六月丁香婷婷色狠狠久久| 5月婷婷6月丁香| 国产精品www.| 中文字幕av日韩精品| 妖精视频一区二区三区| 国产精品9999久久久久仙踪林| 欧美成人三级| 国产成人综合精品| 两个人看的在线视频www| 久久伊人91精品综合网站| 国产香蕉在线| 亚洲欧美精品中文字幕在线| 理论片中文字幕| 91精品国产手机| 又骚又黄的视频| 在线视频欧美区| 欧美日韩乱国产| 亚洲国产乱码最新视频| 成人性生活毛片| 亚洲四区在线观看| 少妇高潮一区二区三区喷水| 久久精品视频免费观看| 亚洲国产综合视频| 懂色av一区二区夜夜嗨| 日本中文字幕在线不卡| 精品一区二区影视| 特级丰满少妇一级| 日本va欧美va精品发布| 国产男女激情视频| 免费看的黄色欧美网站| 国产91在线免费| 国产日韩欧美一区| 无码人妻丰满熟妇区96| 在线视频精品| 成年人视频网站免费观看| 中国女人久久久| 无码人妻精品一区二区三区在线| 亚洲国产高清一区二区三区| 秋霞无码一区二区| 国产精品永久| 国产精品免费成人| 蜜桃久久av一区| 一个色综合久久| 国产精品一区专区| 亚洲av无码一区东京热久久| bt7086福利一区国产| 天天插天天射天天干| 91免费精品国自产拍在线不卡| av网站有哪些| 国产欧美日韩久久| 99自拍视频在线| 亚洲欧美日韩久久| 久久久久久久伊人| 91久久精品一区二区三| 中文字幕在线网站| 日韩一区二区三区免费看| 亚洲av无码专区在线| 亚洲激情视频在线| 国产h在线观看| 久热在线中文字幕色999舞| 91av久久| 国产精品视频大全| 精品一区二区三区在线观看视频| 成人欧美一区二区三区黑人免费| 日本亚洲不卡| 一区二区国产日产| 在线播放不卡| 青青草av网站| 国产精品系列在线观看| 一级特黄a大片免费| 欧美激情中文不卡| 久久久久久久伊人| 欧美综合亚洲图片综合区| 99久久久国产精品无码网爆| 亚洲国产精品悠悠久久琪琪| yw193.com尤物在线| 欧美激情在线一区| 在线日本欧美| 91观看网站| 狠狠综合久久av一区二区蜜桃| 最新黄色av网站| 国产欧美一区二区三区国产幕精品| 成人免费视频久久| 国产成人午夜电影网| 久久久久久久久久久久| 亚洲精品国产无套在线观| 91视频在线视频| 欧美成人性福生活免费看| 国产精品99999| 久久久久久噜噜噜久久久精品| www.成人在线视频| 韩国精品一区二区三区六区色诱| 青青草国产免费一区二区下载 | 日本伊人色综合网| 好男人香蕉影院| 中文字幕视频一区| 亚洲图片欧美日韩| 亚洲国产精品999| 午夜小视频福利在线观看| 国产精国产精品| 免费看久久久| 日韩精品一区二区在线视频| 免费久久精品视频| b站大片免费直播| 亚洲综合av网| 国产免费的av| 色偷偷9999www| 日韩精品三区| 六十路精品视频| 99精品国产在热久久婷婷| 手机在线免费毛片| 中文字幕永久在线不卡| 99re热视频| 亚洲日韩中文字幕| 成人黄色动漫| 加勒比在线一区二区三区观看| 欧美ab在线视频| 国产传媒免费观看| 国产精品福利一区二区| 中国一级片黄色一级片黄| 亚洲欧洲视频在线| 超碰aⅴ人人做人人爽欧美| 九九久久99| 99精品国产福利在线观看免费 | 精品国产伦一区二区三| 日韩在线观看成人| 综合久草视频| 亚洲国产精品影视| 精品一区二区三区免费播放 | 欧美扣逼视频| 欧美最猛性xxxx| 国产免费久久| 国产一区二区在线免费播放| 国产视频一区不卡| 手机av免费观看| 在线观看欧美视频| 福利一区二区免费视频| 亚洲精品成人a8198a| 免费成人美女在线观看| 中文字幕求饶的少妇| 91精品久久久久久久99蜜桃| 91麻豆免费在线视频| 99一区二区| 在线欧美视频| 女同毛片一区二区三区| 色婷婷av一区| av在线中文| 成人女保姆的销魂服务| 国产在线日韩| jjzzjjzz欧美69巨大| 欧美小视频在线| 成人一区二区不卡免费| 成人xvideos免费视频| 欧美一区二区| 手机在线成人av| 色94色欧美sute亚洲13| 免费在线看黄| 永久91嫩草亚洲精品人人| 9191国产视频| 成人国产亚洲欧美成人综合网| 毛片毛片女人毛片毛片| 在线观看日韩视频| 欧美一级大片在线视频| 青青草成人免费在线视频| 26uuu久久综合| 伊人免费在线观看高清版| 欧美麻豆久久久久久中文 | 免费一区二区三区在在线视频| 久久九九99| 黄色a级片在线观看| 日韩激情av在线播放| 51一区二区三区| 超薄肉色丝袜足j调教99| 99久久精品情趣| 国产又粗又长又黄| 91成人免费观看网站| 欧美gvvideo网站| 亚洲男人在线天堂| 884aa四虎影成人精品一区| 91桃色在线| 一区二区视频国产| 99久久久国产精品免费蜜臀| 中文字幕在线日亚洲9| 午夜精品一区二区三区在线视| 日本久久黄色| 少妇精品无码一区二区三区| 欧美性感一类影片在线播放| 国产在线拍揄自揄拍视频| 日韩成人网免费视频| xxxx日本黄色| 欧美日韩高清不卡| 天堂av在线网|