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

Python多進程并行編程實踐: mpi4py 的使用

開發 后端
在高性能計算的項目中我們通常都會使用效率更高的編譯型的語言例如C、C++、Fortran等,但是由于Python的靈活性和易用性使得它在發展和驗證算法方面備受人們的青睞于是在高性能計算領域也經常能看到Python的身影了。本文簡單介紹在Python環境下使用MPI接口在集群上進行多進程并行計算的方法。

前言

在高性能計算的項目中我們通常都會使用效率更高的編譯型的語言例如C、C++、Fortran等,但是由于Python的靈活性和易用性使得它在發展和驗證算法方面備受人們的青睞于是在高性能計算領域也經常能看到Python的身影了。本文簡單介紹在Python環境下使用MPI接口在集群上進行多進程并行計算的方法。

MPI(Message Passing Interface)

這里我先對MPI進行一下簡單的介紹,MPI的全稱是Message Passing Interface,即消息傳遞接口。

  • 它并不是一門語言,而是一個庫,我們可以用Fortran、C、C++結合MPI提供的接口來將串行的程序進行并行化處理,也可以認為Fortran+MPI或者C+MPI是一種再原來串行語言的基礎上擴展出來的并行語言。
  • 它是一種標準而不是特定的實現,具體的可以有很多不同的實現,例如MPICH、OpenMPI等。
  • 它是一種消息傳遞編程模型,顧名思義,它就是專門服務于進程間通信的。

MPI的工作方式很好理解,我們可以同時啟動一組進程,在同一個通信域中不同的進程都有不同的編號,程序員可以利用MPI提供的接口來給不同編號的進程分配不同的任務和幫助進程相互交流最終完成同一個任務。就好比包工頭給工人們編上了工號然后指定一個方案來給不同編號的工人分配任務并讓工人相互溝通完成任務。

Python中的并行

由于CPython中的GIL的存在我們可以暫時不奢望能在CPython中使用多線程利用多核資源進行并行計算了,因此我們在Python中可以利用多進程的方式充分利用多核資源。

Python中我們可以使用很多方式進行多進程編程,例如os.fork()來創建進程或者通過multiprocessing模塊來更方便的創建進程和進程池等。在上一篇《Python多進程并行編程實踐-multiprocessing模塊》中我們使用進程池來方便的管理Python進程并且通過multiprocessing模塊中的Manager管理分布式進程實現了計算的多機分布式計算。

與多線程的共享式內存不同,由于各個進程都是相互獨立的,因此進程間通信再多進程中扮演這非常重要的角色,Python中我們可以使用multiprocessing模塊中的pipe、queue、Array、Value等等工具來實現進程間通訊和數據共享,但是在編寫起來仍然具有很大的不靈活性。而這一方面正是MPI所擅長的領域,因此如果能夠在Python中調用MPI的接口那真是太***了不是么。

MPI與mpi4py

mpi4py是一個構建在MPI之上的Python庫,主要使用Cython編寫。mpi4py使得Python的數據結構可以方便的在多進程中傳遞。

mpi4py是一個很強大的庫,它實現了很多MPI標準中的接口,包括點對點通信,組內集合通信、非阻塞通信、重復非阻塞通信、組間通信等,基本上我能想到用到的MPI接口mpi4py中都有相應的實現。不僅是Python對象,mpi4py對numpy也有很好的支持并且傳遞效率很高。同時它還提供了SWIG和F2PY的接口能夠讓我們將自己的Fortran或者C/C++程序在封裝成Python后仍然能夠使用mpi4py的對象和接口來進行并行處理。可見mpi4py的作者的功力的確是非常了得。

mpi4py

這里我開始對在Python環境中使用mpi4py的接口進行并行編程進行介紹。

MPI環境管理

mpi4py提供了相應的接口Init()和Finalize()來初始化和結束mpi環境。但是mpi4py通過在__init__.py中寫入了初始化的操作,因此在我們from mpi4py import MPI的時候就已經自動初始化mpi環境。

MPI_Finalize()被注冊到了Python的C接口Py_AtExit(),這樣在Python進程結束時候就會自動調用MPI_Finalize(), 因此不再需要我們顯式的去掉用Finalize()。

通信域(Communicator)

mpi4py直接提供了相應的通信域的Python類,其中Comm是通信域的基類,Intracomm和Intercomm是其派生類,這根MPI的C++實現中是相同的。 

 

 

 

同時它也提供了兩個預定義的通信域對象:

  • 包含所有進程的COMM_WORLD
  • 只包含調用進程本身的COMM_SELF 
  1. In [1]: from mpi4py import MPI       
  2.  
  3.                                                  
  4.  
  5. In [2]: MPI.COMM_SELF                           
  6.  
  7. Out[2]: <mpi4py.MPI.Intracomm at 0x7f2fa2fd59d0>  
  8.                                                  
  9.  
  10. In [3]: MPI.COMM_WORLD                           
  11.  
  12. Out[3]: <mpi4py.MPI.Intracomm at 0x7f2fa2fd59f0>  

通信域對象則提供了與通信域相關的接口,例如獲取當前進程號、獲取通信域內的進程數、獲取進程組、對進程組進行集合運算、分割合并等等。

  1. In [4]: comm = MPI.COMM_WORLD 
  2.  
  3. In [5]: comm.Get_rank() 
  4.  
  5. Out[5]: 0 
  6.  
  7. In [6]: comm.Get_size() 
  8.  
  9. Out[6]: 1 
  10.  
  11. In [7]: comm.Get_group() 
  12.  
  13. Out[7]: <mpi4py.MPI.Group at 0x7f2fa40fec30> 
  14.  
  15. In [9]: comm.Split(0, 0) 
  16.  
  17. Out[9]: <mpi4py.MPI.Intracomm at 0x7f2fa2fd5bd0>  

關于通信域與進程組的操作這里就不細講了,可以參考Introduction to Groups and Communicators

點對點通信

mpi4py提供了點對點通信的接口使得多個進程間能夠互相傳遞Python的內置對象(基于pickle序列化),同時也提供了直接的數組傳遞(numpy數組,接近C語言的效率)。

如果我們需要傳遞通用的Python對象,則需要使用通信域對象的方法中小寫的接口,例如send(),recv(),isend()等。

如果需要直接傳遞數據對象,則需要調用大寫的接口,例如Send(),Recv(),Isend()等,這與C++接口中的拼寫是一樣的。 

 

 

 

MPI中的點到點通信有很多中,其中包括標準通信,緩存通信,同步通信和就緒通信,同時上面這些通信又有非阻塞的異步版本等等。這些在mpi4py中都有相應的Python版本的接口來讓我們更靈活的處理進程間通信。這里我只用標準通信的阻塞和非阻塞版本來做個舉例:

阻塞標準通信 

 

 

 

這里我嘗試使用mpi4py的接口在兩個進程中傳遞Python list對象。

  1. from mpi4py import MPI 
  2.  
  3. import numpy as np 
  4.  
  5. comm = MPI.COMM_WORLD 
  6.  
  7. rank = comm.Get_rank() 
  8.  
  9. size = comm.Get_size() 
  10.  
  11. if rank == 0: 
  12.  
  13.     data = range(10) 
  14.  
  15.     comm.send(data, dest=1, tag=11) 
  16.  
  17.     print("process {} send {}...".format(rank, data)) 
  18.  
  19. else
  20.  
  21.     data = comm.recv(source=0, tag=11) 
  22.  
  23.     print("process {} recv {}...".format(rank, data))  

執行效果:

  1. zjshao@vaio:~/temp_codes/mpipy$ mpiexec -np 2 python temp.py 
  2.  
  3. process 0 send [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]... 
  4.  
  5. process 1 recv [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]...  

非阻塞標準通信

所有的阻塞通信mpi都提供了一個非阻塞的版本,類似與我們編寫異步程序不阻塞在耗時的IO上是一樣的,MPI的非阻塞通信也不會阻塞消息的傳遞過程中,這樣能夠充分利用處理器資源提升整個程序的效率。

來張圖看看阻塞通信與非阻塞通信的對比: 

 

 

 

非阻塞通信的消息發送和接受: 

 

 

 

同樣的,我們也可以寫一個上面例子的非阻塞版本。

  1. from mpi4py import MPI                                         
  2.  
  3. import numpy as np                                             
  4.  
  5.                                                                
  6.  
  7. comm = MPI.COMM_WORLD                                           
  8.  
  9. rank = comm.Get_rank()                                         
  10.  
  11. size = comm.Get_size()                                         
  12.  
  13.                                                                
  14.  
  15. if rank == 0:                                                   
  16.  
  17.     data = range(10)                                           
  18.  
  19.     comm.isend(data, dest=1, tag=11)                           
  20.  
  21.     print("process {} immediate send {}...".format(rank, data)) 
  22.  
  23. else:                                                           
  24.  
  25.     data = comm.recv(source=0, tag=11)                         
  26.  
  27.     print("process {} recv {}...".format(rank, data))  

執行結果,注意非阻塞發送也可以用阻塞接收來接收消息:

  1. zjshao@vaio:~/temp_codes/mpipy$ mpiexec -np 2 python temp.py 
  2.  
  3. process 0 immediate send [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]... 
  4.  
  5. process 1 recv [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]...  

支持Numpy數組

mpi4py的一個很好的特點就是他對Numpy數組有很好的支持,我們可以通過其提供的接口來直接傳遞數據對象,這種方式具有很高的效率,基本上和C/Fortran直接調用MPI接口差不多(方式和效果)

例如我想傳遞長度為10的int數組,MPI的C++接口是:

  1. void Comm::Send(const void * buf, int count, const Datatype & datatype, int dest, int tag) const 

在mpi4py的接口中也及其類似, Comm.Send()中需要接收一個Python list作為參數,其中包含所傳數據的地址,長度和類型。

來個阻塞標準通信的例子:

  1. from mpi4py import MPI                                                 
  2.  
  3. import numpy as np                                                     
  4.  
  5.                                                                        
  6.  
  7. comm = MPI.COMM_WORLD                                                   
  8.  
  9. rank = comm.Get_rank()                                                 
  10.  
  11. size = comm.Get_size()                                                 
  12.  
  13.                                                                        
  14.  
  15. if rank == 0:                                                           
  16.  
  17.     data = np.arange(10, dtype='i')                                     
  18.  
  19.     comm.Send([data, MPI.INT], dest=1, tag=11)                         
  20.  
  21.     print("process {} Send buffer-like array {}...".format(rank, data)) 
  22.  
  23. else:                                                                   
  24.  
  25.     data = np.empty(10, dtype='i')                                     
  26.  
  27.     comm.Recv([data, MPI.INT], source=0, tag=11)                       
  28.  
  29.     print("process {} recv buffer-like array {}...".format(rank, data))  

執行效果:

  1. zjshao@vaio:~/temp_codes/mpipy$ /usr/bin/mpiexec -np 2 python temp.py 
  2.  
  3. process 0 Send buffer-like array [0 1 2 3 4 5 6 7 8 9]... 
  4.  
  5. process 1 recv buffer-like array [0 1 2 3 4 5 6 7 8 9]...  

組通信

MPI組通信和點到點通信的一個重要區別就是,在某個進程組內所有的進程同時參加通信,mpi4py提供了方便的接口讓我們完成Python中的組內集合通信,方便編程同時提高程序的可讀性和可移植性。

下面就幾個常用的集合通信來小試牛刀吧。

廣播

廣播操作是典型的一對多通信,將跟進程的數據復制到同組內其他所有進程中。 

 

 

 

在Python中我想將一個列表廣播到其他進程中:

  1. from mpi4py import MPI                                                     
  2.  
  3.                                                                            
  4.  
  5. comm = MPI.COMM_WORLD                                                       
  6.  
  7. rank = comm.Get_rank()                                                     
  8.  
  9. size = comm.Get_size()                                                     
  10.  
  11.                                                                            
  12.  
  13. if rank == 0:                                                               
  14.  
  15.     data = range(10)                                                       
  16.  
  17.     print("process {} bcast data {} to other processes".format(rank, data)) 
  18.  
  19. else:                                                                       
  20.  
  21.     data = None                                                             
  22.  
  23.     data = comm.bcast(data, root=0)                                             
  24.  
  25. print("process {} recv data {}...".format(rank, data))  

執行結果:

  1. zjshao@vaio:~/temp_codes/mpipy$ /usr/bin/mpiexec -np 5 python temp.py 
  2.  
  3. process 0 bcast data [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] to other processes 
  4.  
  5. process 0 recv data [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]... 
  6.  
  7. process 1 recv data [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]... 
  8.  
  9. process 3 recv data [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]... 
  10.  
  11. process 2 recv data [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]... 
  12.  
  13. process 4 recv data [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]...  

發散

與廣播不同,發散可以向不同的進程發送不同的數據,而不是完全復制。 

 

 

 

例如我想將0-9發送到不同的進程中:

  1. from mpi4py import MPI                                                             
  2.  
  3. import numpy as np                                                                 
  4.  
  5.                                                                                    
  6.  
  7. comm = MPI.COMM_WORLD                                                             
  8.  
  9. rank = comm.Get_rank()                                                             
  10.  
  11. size = comm.Get_size()                                                             
  12.  
  13.                                                                                    
  14.  
  15. recv_data = None                                                                   
  16.  
  17.                                                                                    
  18.  
  19. if rank == 0:                                                                     
  20.  
  21.     send_data = range(10)                                                         
  22.  
  23.     print("process {} scatter data {} to other processes".format(rank, send_data)) 
  24.  
  25. else:                                                                             
  26.  
  27.     send_data = None                                                               
  28.  
  29. recv_data = comm.scatter(send_data, root=0)                                       
  30.  
  31. print("process {} recv data {}...".format(rank, recv_data))  

發散結果:

  1. zjshao@vaio:~/temp_codes/mpipy$ /usr/bin/mpiexec -np 10 python temp.py 
  2.  
  3. process 0 scatter data [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] to other processes 
  4.  
  5. process 0 recv data 0... 
  6.  
  7. process 3 recv data 3... 
  8.  
  9. process 5 recv data 5... 
  10.  
  11. process 8 recv data 8... 
  12.  
  13. process 2 recv data 2... 
  14.  
  15. process 7 recv data 7... 
  16.  
  17. process 4 recv data 4... 
  18.  
  19. process 1 recv data 1... 
  20.  
  21. process 9 recv data 9... 
  22.  
  23. process 6 recv data 6...  

收集

收集過程是發散過程的逆過程,每個進程將發送緩沖區的消息發送給根進程,根進程根據發送進程的進程號將各自的消息存放到自己的消息緩沖區中。 

 

 

 

 

收集結果:

  1. zjshao@vaio:~/temp_codes/mpipy$ /usr/bin/mpiexec -np 5 python temp.py 
  2.  
  3. process 2 send data 2 to root... 
  4.  
  5. process 3 send data 3 to root... 
  6.  
  7. process 0 send data 0 to root... 
  8.  
  9. process 4 send data 4 to root... 
  10.  
  11. process 1 send data 1 to root... 
  12.  
  13. process 0 gather all data [0, 1, 2, 3, 4]...  

其他的組內通信還有歸約操作等等由于篇幅限制就不多講了,有興趣的可以去看看MPI的官方文檔和相應的教材。

mpi4py并行編程實踐

這里我就上篇《Python 多進程并行編程實踐: multiprocessing 模塊》中的二重循環繪制map的例子來使用mpi4py進行并行加速處理。

我打算同時啟動10個進程來將每個0軸需要計算和繪制的數據發送到不同的進程進行并行計算。

因此我需要將pO2s數組發散到10個進程中:

 

之后我需要在每個進程中根據接受到的pO2s的數據再進行一次pCOs循環來進行計算。

最終將每個進程計算的結果(TOF)進行收集操作:

  1. comm.gather(tofs_1d, root=0) 

由于代碼都是涉及的專業相關的東西我就不全列出來了,將mpi4py改過的并行版本放到10個進程中執行可見: 

 

 

  

 

 

 

效率提升了10倍左右。

總結

本文簡單介紹了mpi4py的接口在python中進行多進程編程的方法,MPI的接口非常龐大,相應的mpi4py也非常龐大,mpi4py還有實現了相應的SWIG和F2PY的封裝文件和類型映射,能夠幫助我們將Python同真正的C/C++以及Fortran程序在消息傳遞上實現統一。有興趣的同學可以進一步研究一下,歡迎交流。

參考

  • MPI for Python 2.0.0 documentation
  • MPI Tutorial
  • A Python Introduction to Parallel Programming with MPI
  • 《高性能計算并行編程技術-MPI并行程序設計》
  • 《MPI并行程序設計實例教程》 
責任編輯:龐桂玉 來源: Python開發者
相關推薦

2024-03-29 06:44:55

Python多進程模塊工具

2017-06-30 10:12:46

Python多進程

2010-06-02 08:53:51

.NET 4并行編程

2023-12-11 18:18:24

Python編程線程

2014-01-21 11:16:59

MPI并行計算

2020-11-18 09:06:04

Python

2019-03-12 09:20:09

shell爬蟲命名

2010-06-08 08:41:08

.NET 4并行編程

2010-06-07 08:43:46

.NET 4并行編程

2021-02-25 11:19:37

谷歌Android開發者

2024-09-29 10:39:14

并發Python多線程

2010-06-04 09:11:10

.NET并行編程

2022-07-11 10:23:42

云原生Python多核CPU

2023-05-10 07:47:08

Python并發編程

2016-10-09 20:15:30

多線程多進程

2010-10-15 08:57:15

PHP多進程

2024-12-27 08:11:44

Python編程模式IO

2022-03-09 17:01:32

Python多線程多進程

2019-01-17 10:25:56

Python編程語言程序員

2025-10-31 12:00:00

Python并發編程開發
點贊
收藏

51CTO技術棧公眾號

伊人365影院| 六月婷婷在线视频| 国产原创中文av| 欧美视频不卡| 日韩福利视频在线观看| 亚洲人辣妹窥探嘘嘘| а√天堂8资源在线官网| 成人免费av在线| 国产精品国产三级国产aⅴ浪潮| 农村老熟妇乱子伦视频| 亚洲精品aⅴ| 亚洲一二av| 久久亚洲精品国产精品紫薇| 国产精品亚洲欧美导航| 久久久久久久久精| 精品一区不卡| 亚洲成人久久网| 999在线观看| 中文不卡1区2区3区| 亚洲视频 欧洲视频| 久久99国产精品99久久| 国产美女无遮挡永久免费| 一本一道久久综合狠狠老精东影业| 一区二区三区视频在线| 丝袜熟女一区二区三区| 天天综合在线观看| 日韩欧美主播在线| 免费看日b视频| 91社区在线观看| 91影院在线免费观看| 亚洲最大成人免费视频| 国内av在线播放| 宅男噜噜噜66一区二区| 欧美久久精品午夜青青大伊人| 30一40一50老女人毛片| 91精品尤物| 日韩一区二区三区免费观看 | 午夜欧美精品| 最近2019年日本中文免费字幕| 大地资源二中文在线影视观看| 欧美精品三级在线| 8x福利精品第一导航| 日本888xxxx| 春暖花开亚洲一区二区三区| 欧美日韩综合视频网址| 午夜免费福利小电影| 暖暖在线中文免费日本| 亚洲精品日产精品乱码不卡| 欧美aaa在线观看| 毛片在线不卡| 亚洲三级在线观看| 中文字幕av日韩精品| 伊人免费在线| 国产精品萝li| 亚洲综合欧美日韩| 午夜视频在线观看网站| 国产精品你懂的在线| 亚洲巨乳在线观看| 自拍视频在线播放| 国产欧美一区二区精品忘忧草| 日韩高清国产精品| 玖玖综合伊人| 国产亚洲一本大道中文在线| 日韩免费中文专区| 3p视频在线观看| 国产精品免费久久久久| 正在播放国产精品| 香蕉成人app免费看片| 亚洲一区av在线| 99热自拍偷拍| 欧美电影h版| 精品视频1区2区| 国产高清av片| 国产一区二区三区亚洲| 日韩精品专区在线影院重磅| www男人天堂| 日韩大片在线免费观看| 亚洲欧美日韩国产精品| 91狠狠综合久久久久久| 亚洲区综合中文字幕日日| 欧美激情国产高清| 日韩欧美成人一区二区三区| 青青草91视频| 亚洲a成v人在线观看| 日本黄视频在线观看| 国产亚洲va综合人人澡精品 | youjizz.com日本| 色婷婷狠狠五月综合天色拍| 中文字幕亚洲激情| 懂色av懂色av粉嫩av| 99综合精品| 国产欧美亚洲视频| 欧美一级特黄aaaaaa| 国产女主播在线一区二区| 亚洲精品天堂成人片av在线播放 | 国产欧美久久一区二区| av中文字幕播放| 91麻豆国产香蕉久久精品| 亚洲成人午夜在线| xxxcom在线观看| 欧美在线观看一区| 又大又长粗又爽又黄少妇视频| 亚洲a级精品| 久久精品视频网站| 久久久久久久久久久久久av| 国产一区美女在线| 欧美日韩免费高清| 欧美人动性xxxxz0oz| 一本在线高清不卡dvd| 天天色天天综合网| 亚洲精品推荐| 欧美激情手机在线视频| 中文字幕xxxx| av亚洲精华国产精华精| 国产福利片一区二区| xx欧美视频| 日韩精品综合一本久道在线视频| 国产欧美小视频| 在线亚洲自拍| 97欧洲一区二区精品免费| 国产美女性感在线观看懂色av| 依依成人综合视频| 九九热精品在线播放| 蜜桃成人av| 国模吧一区二区| 国产三级第一页| 中文字幕免费不卡| 苍井空浴缸大战猛男120分钟| 天堂va欧美ⅴa亚洲va一国产| 中文字幕亚洲第一| 99re热视频| 久久久不卡网国产精品一区| 91丨porny丨探花| 日韩成人在线观看视频| 北条麻妃99精品青青久久| 成人免费一级片| 久久久不卡网国产精品一区| 91九色在线观看视频| 成人午夜网址| 久久久久久69| 免费看黄网站在线观看| 一区二区三区毛片| 中文字幕一区二区在线观看视频 | 亚洲中文字幕无码中文字| av成人综合| 久久久久久999| 免费观看黄色av| 亚洲va国产va欧美va观看| 无码人妻丰满熟妇区毛片蜜桃精品| 中文在线播放一区二区| 91香蕉电影院| 91麻豆免费在线视频| 91精品国产一区二区三区蜜臀| 国精产品久拍自产在线网站| 另类综合日韩欧美亚洲| 在线观看日韩羞羞视频| 91麻豆精品国产91久久久更新资源速度超快| 亚洲最新av在线网站| 中文在线字幕免费观| 国产精品国产三级国产普通话99| 国产福利在线免费| 国产精品国产三级国产在线观看| 成人淫片在线看| 亚洲色图美国十次| 亚洲国产91色在线| 天天做天天爱夜夜爽| 国产偷国产偷亚洲高清人白洁| 黄色aaa级片| 99久久激情| 成人av播放| 久久青青视频| 最近2019年手机中文字幕| 国产熟女一区二区丰满| 亚洲丶国产丶欧美一区二区三区| 久久久久亚洲AV成人无码国产| 亚洲综合日韩| 亚洲一区二区免费视频软件合集| 国产高清日韩| 97成人超碰免| 国模吧精品人体gogo| 538在线一区二区精品国产| 免费在线观看黄视频| 久久伊人中文字幕| 色www免费视频| 一区精品久久| 视频一区二区三| 日韩免费一级| 国产成人一区二区在线| 成人日批视频| 亚洲欧美日韩爽爽影院| 国产毛片在线视频| 一本色道**综合亚洲精品蜜桃冫| www.99re6| 久久午夜羞羞影院免费观看| 97人人爽人人| 国产亚洲在线观看| 国产大尺度在线观看| 欧美电影在线观看完整版| 国产日韩欧美在线观看| а√天堂中文资源在线bt| 在线看欧美日韩| 十八禁一区二区三区| 精品视频一区二区不卡| 圆产精品久久久久久久久久久| 国产精品国产三级国产普通话蜜臀| 国产伦精品一区三区精东| 毛片av一区二区| 玩弄中年熟妇正在播放| 五月开心六月丁香综合色啪 | 成人乱人伦精品视频在线观看| 国产网站在线| 欧美成在线观看| 91在线直播| 亚洲欧美日韩一区在线| 你懂的网站在线| 7799精品视频| 中文字幕二区三区| 欧美视频13p| 国产成人精品亚洲男人的天堂| 亚洲天堂精品视频| 性猛交娇小69hd| 91色视频在线| 精品国产av色一区二区深夜久久 | 日韩精品中文字幕一区| www.久久网| 色视频一区二区| 国产情侣自拍av| 午夜精彩视频在线观看不卡| 久久久久亚洲av片无码| 国产精品乱码人人做人人爱| 免费在线观看污| 暴力调教一区二区三区| 图片区偷拍区小说区| 国产精品99久久久久久久vr| 午夜免费福利视频在线观看| 美女www一区二区| 丰满少妇在线观看| 日韩电影在线观看一区| 黄色一级大片在线观看| 欧美亚洲三区| 女人另类性混交zo| 久久久www| 亚洲熟妇av一区二区三区| 香蕉成人久久| 欧美精品色婷婷五月综合| 亚洲综合激情| 超碰97人人射妻| 日韩激情一二三区| 天天干天天草天天| 精油按摩中文字幕久久| 亚洲视频第二页| 精品影院一区二区久久久| 中文字幕久久av| 国产一区二区h| 农村末发育av片一区二区| 成人精品电影在线观看| 香港三日本8a三级少妇三级99| aaa亚洲精品一二三区| 一区二区三区少妇| 国产日韩综合av| 国产激情av在线| 亚洲色图制服丝袜| 久久久久久久极品内射| 欧美日韩国产专区| 午夜精品久久久久久久蜜桃| 欧美日韩高清不卡| 国产男男gay体育生白袜| 日韩免费性生活视频播放| 免费看av毛片| 在线视频欧美日韩| 成人免费看片| 性欧美xxxx| 777午夜精品电影免费看| 91系列在线播放| 欧美一区二区三区红桃小说| 日本午夜精品一区二区| 天堂美国久久| 无码 制服 丝袜 国产 另类| 午夜在线精品偷拍| 天堂av.com| 久久蜜臀中文字幕| 91久久国产综合| 午夜国产精品一区| 一区二区视频免费观看| 日韩精品综合一本久道在线视频| 深夜福利视频一区| xxxxx91麻豆| 男人的天堂免费在线视频| 国产精品视频资源| 91精品国产自产在线丝袜啪| 日韩av影视| 欧美午夜影院| 欧美大尺度做爰床戏| 粉嫩av一区二区三区| 黄色片网站免费| 亚洲二区在线观看| 在线免费观看日韩视频| 亚洲国产欧美日韩精品| 婷婷视频在线| 欧美中文字幕第一页| 欧美影院精品| 亚洲精品国产精品久久| 亚洲另类黄色| 精品国产午夜福利在线观看| 国产午夜一区二区三区| 久久久久久久久久久网| 欧美日韩一区二区在线观看| 五月婷中文字幕| 欧美理论电影在线观看| 福利一区二区免费视频| 精品无码久久久久久久动漫| 国产精品国产一区| 欧美日韩在线中文| 豆国产96在线|亚洲| 国产wwwwxxxx| 欧洲人成人精品| 午夜在线视频免费| 色综合视频网站| 电影91久久久| 亚洲欧洲国产日韩精品| 久久久水蜜桃av免费网站| 欧美激情 亚洲| 亚洲美女偷拍久久| 一级日韩一级欧美| 一区二区三区四区视频| 小草在线视频免费播放| 国产精品日本一区二区 | 97xxxxx| 国产成人av一区| 免费无遮挡无码永久在线观看视频| 91麻豆精品国产自产在线| aaa在线免费观看| 国产精品高清在线观看| 国产一区二区三区四区五区| 青青草原成人网| 99精品久久免费看蜜臀剧情介绍| 久久久.www| 日韩视频一区二区| 18av在线视频| 国产精品美女xx| 亚洲午夜激情在线| 中文字幕一区二区三区人妻在线视频 | 亚洲xxx大片| 99视频精品全部免费在线视频| 我要看一级黄色大片| 国产欧美一区二区精品性| 国产精品第6页| 日韩中文字幕av| 亚洲电影二区| 玖玖精品在线视频| 国产精品18久久久久久久网站| 国产大学生自拍| 亚洲国产高清自拍| 国产夫妻在线播放| 久久影视中文粉嫩av| 三级不卡在线观看| 国产福利在线导航| 欧美一区二区三区在线观看 | 一区二区在线观看视频| 亚洲第一第二区| 97视频在线观看亚洲| 西野翔中文久久精品字幕| 国产精品wwwww| 国产精品午夜免费| av一区二区三| 欧美亚洲在线播放| 日韩成人免费| 三上悠亚 电影| 精品免费在线观看| 成年人在线免费观看| 成人做爽爽免费视频| 黄色国产精品| 真实乱视频国产免费观看 | 日本免费色视频| 亚洲综合免费观看高清在线观看| 人人妻人人玩人人澡人人爽| 国产成人一区二| 欧美女人交a| 无码熟妇人妻av| 欧美一区二区免费观在线| 九色porny自拍视频在线播放 | 欧美高清视频| 国产精品一区二区av| 天堂一区二区在线免费观看| 天天色影综合网| 日韩av在线一区| 亚洲电影二区| 欧美 日韩精品| 艳妇臀荡乳欲伦亚洲一区| 理论在线观看| 国产精品一码二码三码在线| 免费观看日韩电影| 国产精品二区视频| 久久久久毛片免费观看| 欧美成人高清电影在线| 肉色超薄丝袜脚交| 里番精品3d一二三区| 亚洲精品xxx| 亚洲av成人无码久久精品| 国产精品羞羞答答xxdd|