999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

申威26010處理器上協程間通信的研究

2023-01-31 08:55:52李少迪吳俊敏周亞偉
計算機應用與軟件 2022年12期
關鍵詞:消費者

李少迪 吳俊敏 張 屹 周亞偉

1(中國科學技術大學軟件學院(蘇州) 江蘇 蘇州 215123) 2(中國科學技術大學計算機科學與技術學院 安徽 合肥 230026)

0 引 言

并行程序間的通信是并行程序之間進行相互協作、共同完成任務的基礎,隨著計算機技術的廣泛應用,單純的計算任務已經不再是制約程序性能的唯一因素,程序之間的通信對程序執行的效率的影響也越來越大。尤其是在互聯網、云平臺等商業并行環境下,程序間的高效通信對提升系統整體性能有重要意義。

申威26010處理器是由我國上海高性能集成電路設計中心研發的一種異構眾核處理器,主要應用于高性能計算領域,是“神威太湖之光”超級計算機[1]的主要組成部分。申威26010處理器在許多高性能計算領域取得了應用[2-3]。但是,由于申威26010處理器存在運行環境復雜、軟件開發與底層硬件結構高度相關等特點,申威26010處理器上普通商業應用的開發移植有一些困難。因此,本文利用了協程的思想,在申威26010處理器上實現了協程的運行框架,以協程的方式代替對從核上線程的直接使用,構建了更適合開發的虛擬化環境,并且使申威26010處理器能夠實現更高的并發能力。

作為協程運行框架中的一個重要部分,協程間的通信模塊需要高效地實現。本文首先設計以循環緩沖區為基礎的生產者-消費者模式的通道通信方式,并且基于主核與從核上支持的不同原子操作,在主核與從核上分別設計了通道通信的同步機制來保證在有多個生產者或多個消費者進行競爭時保證通道消息傳遞的正確性;然后,本文根據協程切換的便捷性,設計了生產者與消費者互相喚醒的機制,減少了由于程序的等待造成的時間浪費;并且,由于協程在從核上的通信性能表現較差,本文基于從核間的寄存器通信方式設計了從核陣列上新的通信方式。

1 研究背景與相關工作

1.1 申威26010眾核處理器

申威26010處理器是一種由我國上海高性能集成電路設計中心自主研發設計的一種異構眾核處理器,屬于申威處理器系列,申威26010處理器采用片上計算陣列集群和分布式共享存儲相結合的異構眾核體系結構,常用于超級計算機的搭建與高性能計算程序的運行,申威26010眾核處理器擁有獨特的計算與存儲結構,其硬件設計如圖1所示。

圖1 申威26010處理器

每一個申威26010處理器芯片包含了260個核心,劃分為4個核組(CG),每個核組中包含了一個運算控制核心(MPE),稱為主核,從屬的64個計算核心(CPE),稱為從核,主從核的頻率都為1.45 GHz。64個從核按照8×8結構組合成一個從核陣列。每個核組通過內存控制器(MC)與一塊8 GB內存相連,四個核組之間由片上網絡(NoC)連接在一起,申威26010處理器基于alpha指令集設計,其中:主核支持完整的alpha指令集;從核上支持精簡的alpha指令集。存儲結構上,主從核都能對內存進行訪問,主核有兩級緩存結構,保證主核對內存的快速讀寫,而從核沒有對內存讀寫的緩存,但每一個從核包含一塊64 KB的局部存儲器(LDM),可以存儲從核上運行的程序以及從核運行所需的數據。每一個從核可以對自己的LDM進行快速讀寫,但不能訪問其他從核的LDM,從核對主存的訪問有兩種模式,一種是細粒度的全局讀入/讀出,這種方式的通信帶寬較低;另一種是粗粒度的DMA訪問方式,可以將主存上的連續數據傳輸到從核的局存中,是申威眾核處理器完成高性能計算主要的數據I/O方式。單處理器的峰值雙精度浮點計算性能為3.06 Tflops。

申威26010處理器支持Linux操作系統,在支持的語言類型上,主核上支持C/C++、FORTRAN程序的運行,在從核上支持C、FORTRAN語言程序的運行。由于申威26010處理器上的主核與從核有不同的運行環境,所以對主核與從核上的程序需要分別編寫與編譯,最后通過混合編譯將主核與從核上的運行程序打包在一個可執行文件中,通過作業提交命令提交給系統執行。

從申威26010處理器的計算構成可以看出,從核的計算能力占申威26010處理器計算能力的98%以上,所以申威處理器上程序的開發需要發揮出從核的運算能力,一般以主從核并行模式為基礎,使用Athread加速線程庫,在主核上完成計算任務的分配,將計算任務進行劃分并分配給從核來運算執行,主核完成從核所不能完成的計算部分以及通信。主從核并行方式讓從核來程序核心計算部分,主核只負責管理,是申威上高性能計算程序開發的必然選擇。

1.2 申威26010處理器上協程框架的實現

協程是一種由用戶控制的,不需要操作系統調度就能夠進行程序的切換運行程序,實現并發的方式,協程的概念并不復雜,基本原理是在程序運行時一個運行程序主動讓出自己的運行控制權,這樣就能切換到其他的程序運行。由于協程相比于線程消耗的系統資源很少,因此常用于高并發場景中[4-5]。由于申威26010處理器的一個從核上僅有一個線程運行,并且不能進行線程的切換操作,從核上程序的并發受到限制,而使用協程的方式,可以突破從核的并發限制,能夠在只有單線程的從核上實現多并發。于是我們團隊決定在申威眾核處理器上開發一個協程的運行框架。基于申威眾核處理器的主從并行結構,設計實現一個集合了調度、執行、通信等模塊的協程運行庫,將從核上的線程以協程的方式來利用,取代原本對從核線程的直接使用,這樣能獲得更高的并發度。協程運行框架基于申威26010處理器硬件結構與申威Athread加速線程庫,為上層應用提供協程使用接口,上層應用程序使用協程進行并發設計時,能夠將計算任務進行更細的劃分,從而獲得更高的性能實現。協程運行庫的層級如圖2所示。

圖2 協程運行庫的層級

申威眾核處理器上協程的實現包含以下幾個部分:

(1) 調度器。調度器運行在主核上,負責完成協程的初始化任務,創建協程并根據從核的負載情況將協程分配到不同從核上執行器的執行隊列,等待執行器的執行。

(2) 執行器。執行器運行在從核上,每一個從核上只能運行一個執行器,所以每個核組包含64個執行器,能夠執行具體的程序,每個執行器包含了兩個隊列,分別是可運行任務隊列與阻塞隊列,可運行隊列中包含能夠直接運行的協程程序,阻塞隊列中包含由于通信等原因阻塞的協程任務。

(3) 通信模塊。協程間如果想要完成相互協作,則需要在協程間進行數據的通信,本文的主要工作即為實現協程間的通信,包含通道通信方式與基于寄存器通信的方式。

2 通道通信

2.1 通道數據結構設計

通道的設計目標是能夠在主核與從核、線程、協程間進行數據的通信。本文以生產者-消費者模式實現消息通信。由于主核與所有的從核都能夠訪問主存,通道設計中將消息數據保存在主存中,并使用循環緩沖區的結構來存儲消息數據。循環緩沖區是一種先進先出的數據結構,相對于隊列減少了對地址的反復操作,增加了穩定性,被廣泛應用在不同領域中[6-7]。循環緩沖區能夠方便地實現生產者-消費者機制的數據交換,并且能夠將數據的寫入與讀取操作分離開來,避免讀取線程與寫入線程的相互競爭,提高通信效率。本文使用循環緩沖區作為通道的基礎結構,循環緩沖區的工作原理如圖3所示。

圖3 循環緩沖區原理

圖3是通道的緩沖區,其中空白的區域代表可以接收消息的空間,實心區域代表已經存放消息的空間,read指針指向緩沖區內下一個能進行讀取的數據,write指針指向下一個能存放數據的單元。使用循環緩沖區可以輕松地實現生產者-消費者模式,在一個生產者向一個消費者發送數據的過程中,生產者從通道獲取write的值,根據write值獲得buffer中將要寫入數據的位置,若緩沖區未滿,則將數據復制到buffer,同時將write的值加一,就完成了一次消息的發送。同理,當消費者讀取時,讀取read值并讀取數據,將read值加一。當read或write超過緩沖區的容量時,通過除以緩沖區容量獲得的余數來獲得相應位置。當read與write相等時,說明緩沖區為空,當write與read的差值等于緩沖區容量時,說明緩沖區已滿。由于生產者只影響write指針,消費者只影響read指針,所以在只有一個讀線程與一個寫入線程的情況下,無須對緩沖區進行同步操作,通信的效率較高。基于循環緩沖區的結構,通道的數據結構設計如算法1所示。

算法1通道的數據結構

struct channel {

unsigned char *buffer;

unsigned int elem_size;

unsigned int capacity;

unsigned int read;

unsigned int to_read;

unsigned int write;

unsigned int to_write;

list read_wait;

list write_wait;

};

其中buffer指向存放數據的緩沖區,elem_size代表一條消息數據的大小,capacity代表緩沖區的容量,write是緩沖區寫入下標,read是緩沖區讀取下標,to_read與to_write作為read與write的對照,用于在多生產者或多消費者并發地進行通道的發送與接收時保證數據同步。兩個list是為了存放因不能向通道發送或接收消息而進入阻塞的生產者或消費者協程的隊列,是通道上生產者協程與消費者協程互相喚醒機制的一部分。

2.2 通道同步機制實現

利用循環緩沖區,可以在單生產者單消費者的情況下不需要同步機制就能安全地進行消息的傳遞。但是在有多個生產者或多個消費者時,多個線程對同一個數據的爭奪可能會產生數據被覆蓋的情況,在多線程競爭時,使用同步機制是有必要的[8]。在申威26010處理器中,主核上可以有多個線程運行,每個從核上有一個線程運行,當主核或從核上運行的程序間進行通道通信時,有可能產生競爭,必須使用同步機制來保證通信的正確性。在申威異構眾核處理器中,主核與從核有不同程度的指令支持,所以在主核與從核上有不同的同步機制實現。

2.2.1主核上通道同步的實現

在多線程同步機制中,可以使用CAS(compare-and-swap)原子操作對多線程競爭的情況進行處理,CAS操作能在一條指令中完成數據的比較與交換,常用于無鎖算法的實現[9]。GCC中的CAS接口如下:

bool__sync_bool_compare_and_swap(type*ptr,type oldval,type newval,…)

這是返回原子操作是否成功的一個CAS接口,輸入參數分別為:需要更新的變量的地址ptr,與變量進行對比的值oldval,變量要更新為的值newval。當讀取到變量地址上的數據值與進行對比的值oldval相等時,就能成功地將變量的值更新為新的值newval,此時返回true,若從變量地址讀取到的值與所認為的值不等,則不進行數據的更新,返回false。

當兩個線程同時使用CAS指令時,只有一個線程能夠成功,其他的線程將會失敗,從而保證了只有一個線程能夠繼續對數據的處理。利用CAS操作構建通道消息發送的一致性保護機制如算法2所示。

算法2主核上的通信同步實現

do {

if(full(chan))

continue;

temp=chan->write;

if(temp !=chan->to_write)

continue;

ok=CAS(&chan->write,temp,temp+1);

} while (!ok);

//復制數據到緩沖區

CAS(&chan->to_write,temp,temp+1);

同步的消息發送中,此算法使用CAS操作并利用to_write作為write值的對照,通過比較write與to_write的值是否相等來判斷是否進行發送操作,如果不相等,說明有其他的生產者正在對通道發送數據,需要等待另一個生產者完成操作;若write的值與to_write相等,說明沒有其他的生產者在進行操作,就可以對通道進行消息發送;使用CAS操作更新write的值,若成功,說明沒有其他的協程成功改變write值,就能根據write將要發送的數據復制到緩沖區相應位置;最后,對to_write的值進行CAS操作,使其加一,就完成了一次消息的發送。由于write與to_write的初值相等,每一次的消息發送操作對兩個變量都加一,所以在沒有生產者正在進行消息發送時,write的值與to_write的值一定相等,若發現兩個變量的值不等時,說明有生產者在對通道進行消息的發送。從通道中接收消息時也同理,對read與to_read進行CAS操作來保證在有多個消費者進行競爭時,緩沖區內的數據不會被重復讀取。這樣,此算法就實現了主核上向通道發送消息以及從通道讀取消息的同步。

2.2.2從核上通道同步的實現

在主核上,可以使用CAS原子操作實現通道消息發送與接收的同步,保證通信的正確性。但是在從核上,由于指令支持不同,并不支持CAS操作,僅支持對數據直接修改的原子操作,如下:

updt_addw(_n_,_addr_)

參數_n_是需要讓變量增加的數值,_addr_是變量的地址。從核上的原子操作直接改變數據的值,而不進行比較,因此相比于CAS操作,同步實現更加復雜。從核上利用原子操作來實現通道的同步如算法3所示。

算法3從核上的通信同步實現

while(1) {

if(full(chan))

co_swap_out();

temp=chan->write;

if(temp==chan->to_write)

updt_addw(1,&(chan->write));

else

continue;

if(chan->write==temp+1){

//復制數據到緩沖區

updt_addw(1,&chan->to_write);

return 0;

}else{

updt_addw(-1,&chan->write);

continue;

}

}

與主核上的同步實現類似,從核上的同步使用to_write作為write的對照。不同的是,在對write值使用原子操作進行更新后,由于沒有判斷write的值是否曾被其他的生產者修改,依然有可能發生比較和修改操作被兩條線程以比較->比較->修改->修改的方式分別執行,導致write的值并不一定為修改前加一。因此需要再次判斷更新后write的值是否為預期值,若相等,說明沒有其他的生產者修改write值,可以進行消息發送并修改to_write,若不等,說明其他的生產者也修改了write值,此時需要使用原子操作將write恢復為被此生產者訪問前的狀態,重新請求消息的發送。這樣,在多個生產者訪問時,最多只有一個生產者能夠向通道發送消息,保證了通道消息發送的同步。但是,在多個生產者進行原子操作后對數據進行對比時,也有可能出現沒有生產者讀取到更新后的write值為更新前的值加一,導致所有的生產者都將write值進行回退,沒有一個生產者完成對通道的消息發送,這會導致運行時間的極大浪費,也使得在同樣數量的生產者或消費者互相競爭的條件下,從核上對通道的發送與接收效率可能會低于主核。

2.3 生產者與消費者之間的互相喚醒機制

在通道通信中,想要進行通信的線程有時無法進行消息通信,如通道已滿時的生產者或通道為空時的消費者,這時程序只能進行等待。當以多線程方式實現時,可以選擇循環訪問或線程切換的機制,但是由于線程的切換消耗的系統資源較多,會導致程序的性能下降,而協程的切換完全在用戶空間內進行,所消耗的資源很少,所以在協程間的通信無法進行時,我們選擇讓當前協程直接進入阻塞,讓其他協程運行,來減少等待造成的時間占用。

當一個消息生產者協程向通道發送數據時,首先會判斷通道緩沖區是否已滿,若未滿,則發送消息并繼續運行;若已滿,則此消息無法發送,通道會進入阻塞,并由協程執行器調度其他的協程來運行。阻塞的協程將被記錄在通道的等待隊列read_wait上。被阻塞的協程不會自動喚醒,也不是由協程執行器喚醒,而是當一個消費者協程從通道取出消息,使通道不再為滿時,會喚醒一個等待發送的生產者,此時阻塞的生產者協程重新進入運行隊列繼續運行,并有較大概率成功向通道內發送消息。同理,消費者協程在通道為空時也會進入阻塞,記錄在隊列write_wait上,并被一個向通道發送數據的生產者協程喚醒。這種互相喚醒的機制,讓一個協程在不能進行通信的情況下直接讓出執行權,讓其他的協程運行,而不是進行循環等待,也沒有像線程切換那樣消耗大量的系統資源,更有效地利用了處理器核心的運算能力。生產者與消費者互相喚醒的流程如圖4所示。

圖4 生產者與消費者的互相喚醒

互相喚醒的機制保證了一個協程因為不能進行發送或接收操作而進入阻塞,當它被喚醒時,通道的狀態能夠讓這個協程進行消息發送或接收。相比于輪詢或者線程的切換,協程之間的互相喚醒的方式消耗系統資源更少,因此程序運行的效率更高。

3 從核間基于寄存器通信的通信方式

3.1 寄存器通信

在進一步的實驗測試中,我們發現,從核上通道通信的效率遠低于主核,原因是:(1) 由于從核訪問主存的性能較低;(2) 由于從核間多生產者或多消費者競爭時同步機制產生的性能損失大于主核。由于申威26010眾核處理器的主要計算能力來源于從核,因此提高從核上的通信效率對提高整個系統的性能有重要意義。于是,本文結合申威眾核處理器上獨特的從核間寄存器通信機制,在從核上實現更高效的數據通信。寄存器通信是一種申威眾核平臺上獨特的通信機制,可以在一個從核陣列上同行或同列的從核間高效地傳輸數據。同行間寄存器通信的接口如下:

LONG_PUTR(var,dest)
LONG_GETR(var)

LONG_PUTR用于向同行的從核發送數據,其中:參數var代表進行交換的數據,dest指示目標從核,dest低四位有效,當最高位為1時向整行進行廣播,最高位為0時,低三位代表目標從核在行或列中的位置。寄存器通信每次發送數據的大小為256位,并且延遲很低。LONG_GETR用于接收發送到本從核的通信緩沖中的數據,當通信緩沖為空時,會等待直到接收到數據。使用寄存器通信可以為申威26010處理器上的程序帶來很大的性能提升[10-11]。

3.2 基于寄存器通信的生產者-消費者通信實現

從寄存器通信的接口中可以看到,使用一次寄存器通信只能與同行或同列的其他從核進行通信,不能向不同行且不同列的從核發送數據。所以,如果想要向一個不同行且不同列的從核發送數據時,需要一個從核作為中轉,如圖5所示。

圖5 向不同行也不同列的從核發送數據

以圖5中的方式就形成了一個單生產者-單消費者的消息通信。只是一個從核需要作為中轉而無法執行計算任務。并且這個從核與兩個從核中的其中一個在同一行,與另一個在同一列。從陣列的結構中可以輕松地看出,可以作為中轉核的從核有兩個。作為中轉的從核從生產者從核由寄存器通信接收消息數據,再通過寄存器通信發送到消費者從核。

利用從核進行中轉可以讓任意位置的生產者與消費者之間進行快速的消息傳遞,但是中轉的從核不能執行計算任務,這會導致計算資源的浪費。為了在整個從核陣列上最大化用于計算的從核的數量,減少中轉導致的計算能力損失,應當盡可能減少中轉的從核數量。由于一行上的從核如果需要向其他行發送數據,至少需要一個核向外發送數據,所以使用8個從核作為中轉,就能完成整個陣列上從核之間的數據傳遞。整個從核陣列上生產者-消費者的通信設計如圖6所示。

圖6 整個從核陣列上生產者-消費者的通信

圖6中第一列的8個核作為中轉核,隨機向后四行的從核發送消息,前四行其他列的從核作為生產者,進行消息數據的生產,后四行其他列的從核作為消費者,接收消息并處理。通過這種方式,在從核陣列的64個從核中,形成了28個生產者與28個消費者的生產者-消費者模式通信,并且每一個生產者生產的消息都有可能被任意一個消費者接收,在一個從核陣列上實現了最大規模的生產者與消費者的隨機配對。

4 測試結果與分析

4.1 通道通信測試

為了了解通道通信的效率,需要在不同的條件下對通道通信的性能進行測試。由于通道的同步機制,需要在不同的生產者/消費者數量條件下,在主核與從核上進行通道通信效率的測試。本文按照以下步驟來進行通信性能的測試:(1) 創建通道,通道的消息數據類型設置為整型,通道的容量設為能夠容納所有生產者發送的消息的容量,以避免通道充滿而產生生產者協程的阻塞從而導致消息發送的性能下降。(2) 模擬消息數據的生產,使用隨機生成的整型數據作為生產者要發送的消息數據,然后經過多次向通道發送獲得總時間,取平均值作為一條消息發送的時間。(3) 模擬消費者接收消息,消費者從已有足夠數據的通道內獲取消息數據,多次獲取消息的總時間取平均值作為一條消息獲取的時間。在不同條件下處理一條消息的平均時間如表1所示。

表1 不同條件下處理一條消息的平均時間 單位:μs

可以看出,從核上通道的通信效率低于主核,并且在有多個生產者或多個消費者進行競爭時,通道通信的時間明顯增加,并且從核上通信時間增加的幅度遠高于主核。

從核上的通信效率低于主核有兩方面的原因,(1) 從核訪問主存的性能低于主核;(2) 從核上的同步機制相比于主核上的同步機制會造成更高的性能損失,當并行的生產者/消費者之間發生競爭時,從核上的同步機制會產生更多的回滾操作,從而使得通信的平均時間增加。

4.2 基于寄存器通信的從核間通信測試

需要將基于寄存器通信的通信方式與從核間的通道通信進行比較,以觀察新的通信方式相比于通道通信獲得的性能提升。本文將測試單生產者-單消費者情況下的性能與使用了整個從核陣列進行通信的整體性能。同樣使用隨機生成的整型數據作為消息數據,使用多次發送的平均值作為一條消息處理時間。結果如表2所示。

表2 基于寄存器通信的通信方式平均一條消息處理時間 單位:μs

將表2中的結果與表1中從核間通道通信的平均時間進行對比可以看出,基于寄存器通信的方式處理一條消息的時間遠低于通道通信,并且在有多個生產者相互競爭的情況下,單條消息的發送時間相比于只有一個生產者的情況下也大幅增加,說明寄存器通信同樣存在著同步導致通信時間增加的情況。由于基于寄存器通信的方式使用了部分從核作為中轉核,不參與消息的生產與接收,所以為了更準確地描述整體通信性能與使用從核數量的關系,本文使用基于寄存器通信方式的單個從核提供的平均帶寬與通道通信單個從核提供的平均帶寬進行對比,結果如表3所示。

表3 單個從核提供的平均帶寬 單位:GB/s

可以看出,在單生產者-單消費者的情況下,基于寄存器通信的方式相比于通道通信單個從核能提供的帶寬提升了82倍,而使用了整個從核陣列進行生產者-消費者通信的情況下,基于寄存器通信的方式下單個從核提供的帶寬相比于通道通信方式下有658倍的提升。這說明基于寄存器通信的方式有效地提高了從核間通信的性能。

5 結 語

本文為申威26010處理器的協程運行框架設計了生產者-消費者模式的通信,在適用于主核與從核的通道通信的設計中,本文基于循環緩沖區設計了通道的數據結構,并基于主核與從核上不同的原子操作設計了主核與從核上通道消息收發的同步機制,保證了通信的正確性,還設計了生產者與消費者的互相喚醒機制,避免等待造成的計算能力損失。為了進一步提高從核間通信的效率,本文基于申威26010處理器獨特的寄存器通信機制,設計一種從核陣列上的從核間相互通信的方式,極大地提高了從核之間進行消息通信的效率。本文的研究為申威26010處理器上的協程運行提供了有效的通信模塊,為上層應用開發提供了高效的通信接口,也為申威26010處理器提供了一種低粒度的通信實現。

猜你喜歡
消費者
消費者網上購物六注意
今日農業(2020年20期)2020-12-15 15:53:19
新車售前維修未告知消費者是否構成欺詐
系無理取鬧?NO! 請為消費者擦干眼淚
人民交通(2019年16期)2019-12-20 07:03:52
論“知假買假”者的消費者身份認定
日化品牌怎樣才能吸引年輕消費者?
消費導刊(2018年22期)2018-12-13 09:19:00
只用一招 讓喊產品貴的消費者閉嘴
知識付費消費者
重新定義消費者
生活用紙(2016年5期)2017-01-19 07:36:14
悄悄偷走消費者的創意
消費者權益保護:讓人歡喜讓人憂
公民與法治(2016年5期)2016-05-17 04:09:48
主站蜘蛛池模板: 99无码中文字幕视频| 国产精品9| 91丝袜美腿高跟国产极品老师| 99re热精品视频中文字幕不卡| 国产在线自揄拍揄视频网站| 国产人成在线观看| 国产欧美一区二区三区视频在线观看| 久久精品亚洲热综合一区二区| 国产欧美日韩精品第二区| 114级毛片免费观看| 国产成人亚洲综合A∨在线播放| 精品欧美一区二区三区久久久| 尤物午夜福利视频| 国产色网站| 无码电影在线观看| 97se亚洲| 992tv国产人成在线观看| 精品视频91| 亚洲日本一本dvd高清| 午夜免费视频网站| 亚洲大尺度在线| 精品1区2区3区| 又粗又硬又大又爽免费视频播放| 国产SUV精品一区二区6| 亚洲成人一区二区| 四虎影视永久在线精品| 亚洲天堂久久久| 免费观看国产小粉嫩喷水 | 亚洲国产天堂久久综合| 久久精品娱乐亚洲领先| 东京热高清无码精品| 熟妇丰满人妻| 欧美日韩91| 欧美成人一级| 日韩激情成人| 欧美性猛交一区二区三区| 91探花在线观看国产最新| 欧美成人综合在线| 色香蕉网站| 国产成人夜色91| 高清大学生毛片一级| 尤物亚洲最大AV无码网站| 18禁不卡免费网站| 欧美成人精品一级在线观看| 亚洲欧美日韩成人在线| 国产制服丝袜91在线| 狠狠色噜噜狠狠狠狠奇米777| 欧美日韩国产精品va| 国产精品99久久久久久董美香| 午夜小视频在线| 91破解版在线亚洲| 国产精品女在线观看| 国产欧美精品一区aⅴ影院| 91高清在线视频| 老司机精品久久| 国产97视频在线| 国产大片喷水在线在线视频| P尤物久久99国产综合精品| 香蕉色综合| 9啪在线视频| 91啪在线| 国产日韩欧美中文| 中文无码精品A∨在线观看不卡 | 亚洲黄网在线| 男女性色大片免费网站| 九色在线视频导航91| 欧美日韩在线亚洲国产人| 色欲不卡无码一区二区| 蝌蚪国产精品视频第一页| 亚洲伦理一区二区| 直接黄91麻豆网站| 亚洲激情区| 自慰高潮喷白浆在线观看| 日韩成人在线视频| 国产在线观看99| 国产69囗曝护士吞精在线视频| 国产精品亚洲日韩AⅤ在线观看| 中文字幕亚洲第一| 性网站在线观看| 五月激情综合网| 亚洲欧美另类日本| 欧美激情一区二区三区成人|