《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 解決方案 > OpenEM簡介和基于OpenEM的大矩陣乘實現

OpenEM簡介和基于OpenEM的大矩陣乘實現

2013-12-26
作者:James Li---Multi-core DSP / FAE
關鍵詞: 軟件 OpenEM KeyStone

摘要

OpenEM 的全稱是Open Event Machine。是TI 針對嵌入式應用開發的multicore runtime system library。OpenEM 可以在多核上有效的調度,分發任務。它把任務調度給負載輕的核,進而實現動態的負載平衡。OpenEM 是基于TI Keystone 系列芯片的multicore Navigator 構建的,具有開銷小,效率高的特點。本文首先對OpenEM 的原理做了簡單的介紹。然后結合一個大矩陣乘的演示用例詳細介紹了OpenEM 的使用。最后通過量化分析這個演示用例的執行cycle 數,總結了OpenEM 的效率和局限。希望本文能成為學習OpenEM 的讀者的一個有用的參考。

1、OpenEM 簡介

OpenEM 的全稱是Open Event Machine。它是TI 開發的可應用于Keystone 多核DSP 的multicore runtime system library。OpenEM 的目的是在多核上有效的調度,分發任務,實現動態的負載平衡?;贠penEM,用戶可以很容易的把原來的單核應用移植到Keystone 多核芯片。需要注意的是OpenEM 目前只能把任務調度分發到同一個DSP 的多個核上,不能跨DSP 調度分發。OpenEM不依賴于BIOS。它可以在芯片上裸跑,代碼精簡,效率高。而且,OpenEM不同于業界已經有OpenMP 和OpenCL 等開放式的multi-core runtime systems。它是針對嵌入式系統的設計,更能滿足嵌入式設計的實時性要求。TI 的keystone 架構多核芯片中有Multicore Navigator。它由Queue Manager(簡稱為QMSS)和一系列Packet DMA engine 構成。OpenEM就是基于這套硬件系統構建的。例如,OpenEM 的scheduler 是運行在QMSS 的PDSP(QMSS內部的RISC 處理器)上的。OpenEM的preload 功能是通過QMSS 的packet DMA 實現的。熟悉QMSS 的編程對學習OpenEM 很有幫助。OpenEM 是MCSDK 的一個組件。它還在不斷的發展改進中。本文對OpenEM 的介紹以及演示用例都是基于BIOS MCSDK 2.01.02 的OpenEM 1.0.0.2。

1.1 OpenEM 軟件對象

下面通過列表和圖示介紹了OpenEM的主要軟件對象。表1 是OpenEM 的主要軟件對象的列表。

需要注意的是,本文介紹的OpenEM 的運行模式是:Scheduler 運行在PDSP,Dispatcher 是“run to completion ”模式。

圖1 是一個軟件對象關系圖,顯示出了表1 中列舉的軟件對象。定義了2 個queue group,5 個queue 和3 個execution object。Queue group1 的core mask 對應核0 和1。所以來自queue1,2,3,4 的event 只能在核0 和核1 上執行,因為這些queue 屬于queue group1。Queue group2 的core mask 對應核2 和3。所以來自queue5 的event 只能在核2 和核3 上執行,因為queue5 屬于queue group2。execution object 1 和queue 1,2,3 映射關聯。execution object 2 和queue 4 映射關聯。execution object 3 和queue 5 映射關聯。圖中的藍線表示了event 的行徑,紅線表示command 的行徑。圖中的SD queue 是hardware queue,它不是一個軟件對象而是OpenEM內部的組件。

1.2 OpenEM 的兩個重要概念

OpenEM中有兩個容易混淆的重要概念:prefetch 和preload。

• Prefetch 是指每個DSP 核向scheduler 發命令,告訴scheduler“本核已經空閑了,可以分配新的工作給本核了”。只有收到一個核的prefetch 命令,scheduler 才會調度新的event 給這個核。如果DSP 核不發出prefetch 命令,它就不會被分派任務。這是OpenEM 的scheduler的基本調度原則。

• Preload 和event 的屬性有關。通常,event 的數據是位于DDR 的。如果DSP 核直接訪問DDR 效率會比較低。所以,OpenEM 可以把event 的數據通過QMSS 的packet DMA 搬到DSP 核的local L2。這個搬移的過程就是preload。每個event 的數據是否做preload 是可配的。每個event 在創建的時候都可以指定一個preload 屬性。Event 的preload 屬性可以是:

– Preload disable, 即不做預搬移

– Preload up to sizeA,即做預搬移,但是最多只搬sizeA bytes

– Preload up to sizeB,即做預搬移,但是最多只搬sizeB bytes

– Preload up to sizeC,即做預搬移,但是最多只搬sizeC bytes

– 其中SizeA,SizeB 和SizeC 是常數,在OpenEM 初始化的時候可以配置。

1.3 OpenEM 的常用API cycle

OpenEM的附帶開銷是應用最關注特性之一。所以我們實測了OpenEM 常用API 的cycle 數如表2。需要注意的是:由于OpenEM會負責cache 一致性的維護,而有些API 的處理過程中含有cache 一致性的維護操作。所以這些API 的調用cycle 數很大程度上取決于它對多大的數據緩沖區做了cache 一致性的維護。本文測試這些cycle 的場景使用的數據緩沖區的大小是是4096 words(32bit)。

2基于OpenEM 的大矩陣乘實現

   

大矩陣相乘的目的是計算X*Y = Z  

矩陣X 是(100 ×2048 )的浮點實數矩陣。

矩陣Y 是(2048 ×2048 )的浮點實數矩陣。

矩陣Z 是(100 ×2048 )的浮點實數矩陣。

由于矩陣Y 的數據量很大,所以在多核DSP 上可以把它拆分成多個子塊,交給多個DSP 核并行計算。如圖2 所示。

2.1 基于OpenEM 的大矩陣乘方案設計

2.1.1 Memory 使用

Shannon DSP (6678)的內存系統包括片內的LL2(local L2)和SL2(shared L2)。加上片外的DDR。LL2 的size 是512 Kbytes,每個核有一份LL2。SL2 的size 是4Mbytes,8 個核共享SL2。DDR size 和硬件板卡設計有關,一般在1G bytes 以上。C66x 核對LL2 的訪問效率最高,對SL2 的訪問效率稍差,對DDR 的訪問效率最低。基于多種存儲區間的不同特性,我們對數據存儲位置按如下規劃(參見圖3):

– 矩陣X 的size 是800 Kbytes,存儲是shared L2

– 矩陣Y 的size 是16 Mbytes,存儲是DDR

– 矩陣Z 的size 是800 Kbytes,存儲是shared L2

雖然矩陣Y 存儲在DDR,但是我們啟用了OpenEM 的preload 功能。Preload 就是通過QMSS 的packet DMA 把待處理的event 數據(通常位于DDR)搬到被調度core 的LL2。所以DSP 核運行的時候不直接從DDR 取數。這保證了DSP 核的數據訪問效率。

2.1.2 處理流程

OpenEM中要有一個DSP 核作為主核,其他核就是從核,主核要完成的工作較多。本文的演示用例中,核0 是主核,核1~7 是從核。主從核的分工差異如圖4:

1. 初始化QMSS 和free pool。

2. OpenEM 的global 初始化和local 初始化。global 初始化是主核執行。local 初始化是每個核各自執行。Local 初始化要等global 初始化完成才能開始。所以,中間需要加一個barrier。Barrier 可以理解成一個同步點,所有DSP 核在這個點完成一次同步再繼續向下執行。本演示用例的Barrier 是通過共享內存的軟件信號量實現的。

3. 主核構造生產者/消費者場景并產生待處理的event。生產者在OpenEM 中不是一個軟件對象。我們可以把產生event 并發送到queue 的函數認為是生產者。消費者就是execution object,溝通生產者和消費者的管道就是queue。構造生產者/消費者場景就是創建execution object 和queue 并且把它們關聯起來。

4. 主核和從核進入event 處理的過程。

5. 主核檢測到所有event 都處理完成后為每個DSP 核(包括它自己)產一個exit job。

6. 主核和從核處理exit job。從核直接調用exit(0)退出。主核先做結果驗證然后調用exit(0)退出。

本文演示用例實現的幾個特點是:

• OpenEM 的free pool 是由用戶初始化的。在初始化free pool 的時候event 描述符不指向數據緩沖區。等分配了一個event 的時候再在這個event 對應的描述符上掛數據緩沖區。這樣可以避免不必要的數據拷貝(從global buffer 拷貝到event buffer)。

• 主核通過查詢free pool 中的event 個數是否恢復回初始值來判斷是否所有“矩陣乘event”都處理。因為:

 

– Free pool 在初始化以后有N 個free event,

– 從中分配了若干個event 后,free event 就減少了相應的個數,

– 每個core 每處理完一個event 就把這個event 回收到free pool,free pool 的event 個數就加一。當free pool 的event 個數恢復回N,就說明所有event 都處理完了。

2.2 基于OpenEM 的大矩陣乘實現

在初始化OpenEM之前首先要做multicore Navigator 的初始化。包括:PDSP firmware 的download,Link RAM 的初始化,Memory region 的初始化還有free pool (也就是free descriptorqueue)的初始化。這不屬于本文介紹的范疇,本文直接介紹OpenEM的初始化。

2.2.1 OpenEM Global 初始化

OpenEM的global 初始化通過調用API 函數ti_em_init_global()完成的。這個API 的入參是下面所示的結構體。其中所列的參數是本文的演示用例使用的配置參數。本文針對每個參數的作用做了注釋。了解了參數了含義,就能了解OpenEM 的global 初始化的大致做了些什么。

注釋:

1. OpenEM要使用hardware queue 資源。hw_queue_base_idx 用來指定OpenEM 從哪個hardware queue 開始可用。

2. OpenEM 的少量操作需要多DSP 核訪問共享的數據結構。是通過hardware semaphore 實現多核lock/unclock 的。所以通過hw_sem_idx 告訴OpenEM該使用哪一個hardware semaphore。

3. 指定preload 使用的QMSS packet DMA 的通道的起始索引。QMSS packet DMA 有32 個RX/TX channel。在OpenEM 中,每個DSP core 要占用一個TX/RX channel。

4. 指定preload 使用的QMSS Tx queues 的起始索引。要和dma_idx 對應起來。QMSS 有32 個TX queue,索引是800~831。對應QMSS packet DMA 的TX channel 0~31。所以,如果前面配置的dma_idx 是0,那么這里配置的dma_queue_base_idx 應該是800。

5. 指定OpenEM local free pool 對應的free queue index。Local free pool 是和preload 相關的。local free pool 在物理上是一個free descriptor queue。里面存儲著2 個host 描述符。每個描述符對應一個local L2 buffer。如果發生preload,packet DMA 就從free descriptor queue pop 描述符,然后把數據傳到描述符指向的local L2 buffer。每個DSP 核有一個local free pool。例如,在我們的演示用例中core0~7 對應的free descriptor queue 索引是2050~2057。

6. 指定OpenEM global free pool 的個數。每個global free pool 包括4 個初始化參數,例如{ globalFreePoolFdqIdx, TI_EM_COH_MODE_ON,TI_EM_BUF_MODE_GLOBAL_TIGHT,0}。參數1是這個global free pool 對應的free queue index。接下來幾項是這個pool 中的buffer 的屬性。Global free pool 是用來從中分配free event 的。調用em_alloc()的入參之一就是free pool index。

7. 配置preload 門限,參見本文1.2 節的敘述。

2.2.2 創建生產者/消費者場景

前面介紹過,在OpenEM 中,消費者就是execution object,溝通生產者和消費者的管道就是queue。本小節介紹怎樣創建execution object 和queue 以及怎樣把它們關聯起來。關于怎樣產生event,本文在下一小節描述。OpenEM 有下列API 供應用調用:

• 調用em_eo_create()可以創建execution object

• 調用em_queue_create()可以創建queue

• 調用em_eo_add_queue()可以把queue 和execution object 映射起來

 

本演示用例通過參數配置表列出execution object, queue group object 和queue object 的參數,然后通過解析函數解析配置表再調用OpenEM的API,這樣各個軟件對象的參數在配置表中一目了然,代碼的可讀性較好。圖5 是本演示用例的映射關系。

 

需要注意的是coremask 總共有64 個比特,但是目前6678 最多也只有8 個DSP 核。所以大量mask 比特是用不到的,目前。核0~7 對應的mask 比特是位于byte[4]的bit0:7

需要注意的是queue 到execution object 的映射是通過receiver 函數關聯起來,如紅色高亮顯示部分。

初始化job的偽代碼如下:

2.2.3 產生event

本文的演示用例把matrix Y 切分成了128 個2048*16 的子塊,每個event 對應一個子塊。Event被發送給execution object 以后,receive 函數計算Matrix X 乘與matrix Y block,即100*2048 ×2048*16 的矩陣乘,產生100*16 個輸出。event 的產生包括下面幾個簡單步驟:

• 調用em_alloc 函數,從public pool 獲取free 的event 描述符并且enable preloading。

• 把待處理的數據緩沖區掛到描述符上,也就是把描述符的buffer 指針指向這個數據緩沖區。

• 在描述符的software info 域填上job index。

• 調用em_send,把event 發送到對應的queue,也就是proc queue。

下面是產生event 的代碼:

需要注意的是Event 產生的時候,它被哪一個execution object 處理還沒有確定。因為execution object 只是和queue 關聯的。當把event 發送到一個queue 的時候,負責處理event 的execution object 就確定了。所以在調用em_send()發送event 到queue 的時候參數之一就是要發送到的queue 的handler。

2.2.4 運行和exit

如前所述,“矩陣乘event”是通過proc queue 發給scheduler 的,所以它被proc queue 映射到mat_mpy calc 這個execution object 上。Dispatcher 收到這個event 后就調用“mat_mpy calc”對應的receiver 函數計算矩陣相乘。因為proc queue 所屬的queue group 是映射到所有DSP 核的,所以128 個“矩陣乘event”是在所有核上并行處理的。每個核處理完event 后就把它釋放回global free pool。這樣這個event 又成為一個free 的event。

 

如2.2.3 節所述,主核可以通過查詢global free pool 的描述符個數是否恢復來判斷是否所有“矩陣乘event”已經處理完。

 

當所有“矩陣乘event”處理完后,主核再產生8 個“exit event”發送到exit queue。理論上scheduler 可以把exit job 調度給任意一個核,而不會保證每個核一個exit job。所以exit job 中的處理比較特殊。exit job 的receiver 函數直接執行系統調用exit(0)。這樣就不會返回到Dispatcher,也不會再發出prefetch command。而另一方面,scheduler 是在收到DSP 核的prefetch command 以后才把event 調度給這個核的。這個機制保證了每個核收到且僅收到一個“exit event”。

在exit job 的receiver 函數中,主核執行的分支稍有差異。主核需要先做完結果的校驗再執行系統調用exit(0)。所以在板上運行是會觀察到其他核很快(小于1s)就從run 狀態轉換到abort 狀態,而主核保持run 了很長時間(大約50s)才進入abort 狀態。原因是:在主核上執行結果驗證工作時產生校驗結果的函數計算耗時比較長。

下面是exit job 的receiver 函數的代碼主干:

2.3 基于OpenEM 的大矩陣乘性能測試結果

2.3.1 算法代碼和cycle 數的理論極限

設r1 是X 矩陣的行數,c1 是X 矩陣的列數,c2 是Y 矩陣的列數。在我們的演示用例中r1 =100, c1 = 2048, c2 = 2048。如前所述,Receiver 函數要計算100*2048 ×2048*16 的矩陣乘,對應下面的偽代碼:

循環內核是4 個cycle。如果只考慮循環內核消耗的cycle 數,計算100*2048 ×2048*16 的矩陣乘需要的cycle 數是100/2*16/2*2048/4*4 = 819,200 cycle。整個X*Y=Z 包括計算128 個這樣的矩陣乘。所以總的cycle 數是819,200*128 = 104,857,600 cycles。在1Ghz 的C66 核上這相當于104.8ms。但是我們的上述理論計算沒有考慮循環的前后綴消耗的cycle 數,也沒有考慮cache miss stall 的等待時間。在6678EVM 板的單個DSP 核上實測,計算X*Y=Z 消耗的實際時間是190,574,214 cycles。相當于190ms。

2.3.2 基于OpenEM 的性能測試結果

基于OpenEM的演示用例實現過程中,DSP 代碼中嵌入了少量測試代碼收集運行的cycle 信息。每個核把自己處理每個event 的起始和結束時間記錄在內存(我們通過一個全局timer 來保證所有DSP 核記錄的時間戳在時間軸上是同步的)。這些時間戳用CCS 存到主機做后處理分析。通過分析,我們可以得到8 個DSP 核并行處理消耗的時間。還可以分析每個DSP 核的忙/閑區間。

測試結果是,從第一個event 開始處理到最后一個event 處理完,總時間是31,433,438 cycle,也就是31.4ms。也就是說,通過OpenEM把單DSP 核的工作負載平衡到8 個DSP 核上能達到的DSP 核利用率是190,574,214/(31,433,438*8)= 76%。

通過對時間戳的處理我們得到下面的運行圖,“-”表示receiver 函數處理event 的區間,本文稱之為有效時間。“#”表示receiver 之外的區間(也就是代碼在dispatcher 中執行的區間),本文稱之為調度開銷。每個“-”和“#”刻度表示100,000 CPU cycle。

從上面的執行圖看,調度開銷不小,占了大約15~20%的時間。但是這只是表面的現象。實際上,調度開銷的大部分時間里,Dispatcher 是在查詢hardware queue,等待新的event。這是因為preload 沒能及時完成導致的。因為同時給8 個核做preload 需要很大的數據搬移的流量。根據以往的測試結果。使用QMSS 的packet DMA 從DDR3 輸入數據到local L2 的流量大約是4G bytes 每秒。那么preload 8 個event 總的數據量是4byte * 2048 rows * 16 columns * 8 core = 1M bytes,需要的時間是1/4 ms。因為每個“-”和“#”刻度表示100,000 CPU cycle,運行圖中紅線長度就代表preload 8 個event 的時間,它非常接近250,000 cycle。理論計算和實際值基本吻合,所以我們認為調度延遲是packet DMA 的傳輸流量不足導致的。

我們也測試了不使用pre-load 的場景。觀測到scheduler 調度一個event 的延遲大約是1200 個C66 CPU cycle。但是DSP 核處理一個event 的耗時增大到原來的10 倍。所以,pre-load 雖然會導致QMSS packet DMA 流量不足成為凸顯的瓶頸,但是從總體效率來看還是非常必要的。

細心的讀者可能會發現76% + 20% = 96%,并不是100%。我們分析時間戳發現,8 個DSP 核同時運行的場景下,每個核處理一個100*2048 ×2048*16 的矩陣乘的時間比只有一個DSP 核運行的場景下的時間稍長。原因是:我們的演示用例中X 矩陣和Z 矩陣是存儲在shared L2 的,8 個核同時運行就會同時讀寫這兩個buffer,導致產生shared L2 的bank 沖突。所以性能下降了。

3、總結

OpenEM具有使用簡單,功能實用,執行高效的特點。能在KeyStone 多核DSP 上實現動態的負載平衡。它一方面提供了強大的功能,另一方面也給應用留出了很大的靈活性。例如,通過讓應用初始化free pool 方便了buffer 的管理。OpenEM 的現有功能已經能夠支持基本的應用。隨著版本更新功能還將不斷完善。

 

Reference

Ref[1]   ti.openem.white.paper.pdf 位于OpenEM 安裝目錄

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          亚洲第一级黄色片| 欧美日韩综合一区| 久久精品一本| 欧美视频久久| 欧美一区二区三区四区高清| 国产真实乱子伦精品视频| 亚洲欧美日韩精品久久久久| 国产精品人成在线观看免费| 国语自产偷拍精品视频偷| 国产精品一区二区久激情瑜伽| 亚洲午夜久久久久久尤物| 国产日韩欧美在线看| 亚洲在线免费| 欧美日韩四区| 久久亚洲国产精品日日av夜夜| 欧美日韩精品免费观看视一区二区| 一区二区不卡在线视频 午夜欧美不卡'| 午夜精品一区二区三区在线视| 亚洲高清毛片| 亚洲国产日韩精品| 欧美日韩国产高清视频| 日韩视频亚洲视频| 日韩午夜电影av| 在线天堂一区av电影| 欧美片在线播放| 亚洲欧美在线高清| 日韩视频在线播放| 亚洲视频在线观看视频| 国产精品99久久久久久久久久久久| 亚洲福利视频一区二区| 在线观看91精品国产入口| 一区二区免费看| 久久久久久夜| 久久精品夜色噜噜亚洲aⅴ| 亚洲高清网站| 亚洲自拍16p| 亚洲综合色丁香婷婷六月图片| 翔田千里一区二区| 久久人人97超碰人人澡爱香蕉| 欧美夜福利tv在线| 国产精品久久国产精麻豆99网站| 亚洲欧美在线免费观看| 国产精品一区二区三区久久久| 国产九九精品视频| 亚洲国产精品久久久久秋霞影院| 在线日本欧美| 久色婷婷小香蕉久久| 国产日韩欧美高清| 欧美另类69精品久久久久9999| 国产区欧美区日韩区| 狠狠色噜噜狠狠狠狠色吗综合| 狠狠操狠狠色综合网| 亚洲欧美国产制服动漫| 国产欧美日韩一区二区三区| 玖玖玖免费嫩草在线影院一区| 亚洲精品亚洲人成人网| 国产一区在线播放| 激情懂色av一区av二区av| 久久人人97超碰国产公开结果| 久久亚洲电影| 欧美成人精品福利| 一区二区三区中文在线观看| 伊人春色精品| 9人人澡人人爽人人精品| 亚洲欧美日韩成人| 欧美日韩国产精品一区| 国产一区二区三区免费在线观看| 欧美a级理论片| 久久亚洲午夜电影| 午夜精品视频| 欧美日韩成人在线| 国产欧美成人| 国产欧美日韩综合一区在线播放| 国产农村妇女毛片精品久久莱园子| 欧美精品一区在线| 欧美视频一区二区三区在线观看| 久久精品在这里| 欧美激情综合网| 亚洲国产高清自拍| 国产婷婷一区二区| 老司机67194精品线观看| 欧美一区二区性| 久久国产精品99精品国产| 国产精品久久久久天堂| 亚洲一本视频| 欧美日韩综合久久| 国产在线不卡精品| 久久美女艺术照精彩视频福利播放| 99精品国产高清一区二区| 欧美日韩精品在线视频| 欧美破处大片在线视频| 亚洲欧美一区二区三区在线| 欧美日韩精品在线视频| 日韩性生活视频| 久久久国产成人精品| 亚洲国产乱码最新视频| 欧美日韩精品免费看| 久久艳片www.17c.com| 国产一区激情| 久久精品国产久精国产一老狼| 久久精品国产视频| 亚洲电影网站| 国产欧美一区视频| 国产欧美一区二区三区久久人妖| 久久精品国产v日韩v亚洲| 99亚洲一区二区| 娇妻被交换粗又大又硬视频欧美| 欧美高清视频一区二区| 欧美在线高清| 亚洲午夜精品国产| 狠狠色丁香婷婷综合久久片| 久久成人免费电影| 欧美日韩国产色站一区二区三区| 在线欧美电影| 99精品视频免费在线观看| 国产精品麻豆成人av电影艾秋| 亚洲人成网站999久久久综合| 亚洲一区二区精品在线观看| 国产网站欧美日韩免费精品在线观看| 久久天堂成人| 久久久一本精品99久久精品66| 国产精品mm| 一区二区三区视频在线观看| 亚洲综合视频一区| 欧美日韩亚洲一区二区| 久久本道综合色狠狠五月| 亚洲高清在线观看一区| 欧美激情一二三区| 亚洲精品一区在线观看香蕉| 欧美精品久久99久久在免费线| 免费不卡在线观看| 国产美女一区| 欧美黄色成人网| 日韩午夜av电影| 在线观看欧美| 欧美久久在线| 欧美日韩日本网| 亚洲欧美日韩爽爽影院| 亚洲精品国久久99热| 在线精品国产欧美| 久久精品视频导航| 欧美另类高清视频在线| 国产香蕉久久精品综合网| 性久久久久久久久久久久| 在线观看精品视频| 欧美亚州在线观看| 老色鬼久久亚洲一区二区| 欧美激情一区二区三区在线| 在线观看国产日韩| 国产一区二区日韩精品欧美精品| 国产精品免费视频观看| 久久综合五月| 久久综合伊人77777蜜臀| 欧美一级淫片播放口| 欧美日韩高清在线播放| 国产亚洲aⅴaaaaaa毛片| 亚洲欧美日韩视频一区| 狂野欧美激情性xxxx| 久久久久看片| 午夜精品久久久久久久久久久久久| 欧美精品久久久久久久久老牛影院| 亚洲婷婷综合久久一本伊一区| 欧美日韩国产高清| 亚洲蜜桃精久久久久久久| 国产精品亚洲一区二区三区在线| 亚洲国产成人av好男人在线观看| 中文有码久久| 亚洲精品一区二区网址| 国产精品捆绑调教| 99视频在线精品国自产拍免费观看| 嫩草伊人久久精品少妇av杨幂| 欧美乱在线观看| 欧美人与禽猛交乱配视频| 亚洲一区二区三区四区五区午夜| 蜜桃久久av一区| 一区二区三区导航| 亚洲淫片在线视频| 欧美视频网站| 国产乱码精品一区二区三区不卡| 亚洲已满18点击进入久久| 欧美在线一区二区| 国产精品久久久久久av下载红粉| 国产精品亚洲人在线观看| 亚洲伦理一区| 国产精品系列在线播放| 国产精品国产三级国产aⅴ9色| 国产精品久久77777| 久久这里有精品15一区二区三区| 午夜精品免费在线| 亚洲高清久久网| 一区在线播放视频| 亚洲已满18点击进入久久| 欧美日韩国产美| 久久久成人网| 新狼窝色av性久久久久久| 欧美黄色一级视频| 麻豆精品国产91久久久久久| 亚洲麻豆国产自偷在线| 久久激情视频免费观看| 国产伦精品一区二区三区在线观看| 中国日韩欧美久久久久久久久| 欧美日韩一级黄| 欧美成年人视频| 欧美日韩一区二区欧美激情| 在线精品视频一区二区三四| 国产日韩在线看| 亚洲精品久久久一区二区三区| 欧美一区二区三区免费观看视频| 欧美极品在线播放| 欧美一级理论性理论a| 雨宫琴音一区二区在线| 国产精品久久久久久妇女6080| 亚洲美女av网站| 国产精品美女久久久久久免费| 国产精品入口夜色视频大尺度| 国产日产精品一区二区三区四区的观看方式| 在线综合视频| 亚洲女爱视频在线| 国产主播一区二区三区四区| 国产精品私房写真福利视频| 亚洲美女淫视频| 性欧美videos另类喷潮| 欧美激情视频免费观看| 日韩亚洲精品在线| 亚洲国产天堂久久综合网| 久久久www成人免费毛片麻豆| 欧美亚州一区二区三区| 亚洲二区在线视频| 亚洲片国产一区一级在线观看| 99在线精品免费视频九九视| 欧美日韩在线一二三| 国产麻豆日韩欧美久久| 羞羞答答国产精品www一本| 欧美精品久久一区二区| 夜久久久久久| 亚洲视频二区| 久久综合精品一区| 国产精品区二区三区日本| 狠狠v欧美v日韩v亚洲ⅴ| 欧美午夜宅男影院在线观看| 亚洲一区二区三区视频播放| 亚洲作爱视频| 亚洲电影免费| 日韩午夜在线| 免费91麻豆精品国产自产在线观看| 欧美综合激情网| 国产精品高清一区二区三区| 性欧美暴力猛交69hd| 亚洲一级黄色av| 日韩午夜av电影| 国产日韩精品综合网站| 亚洲三级色网| 午夜激情久久久| 亚洲欧洲视频在线| 欧美日韩亚洲国产精品| 国产日韩一区欧美| 久久久www成人免费精品| 欧美在线播放| 国产精品网站在线播放| 亚洲黄色在线视频| 亚洲欧美www| 红桃视频欧美| 亚洲淫片在线视频| 午夜天堂精品久久久久| 一区二区三区在线观看视频| 欧美精品乱人伦久久久久久| 篠田优中文在线播放第一区| 亚洲三级色网| 久久精视频免费在线久久完整在线看| 欧美性猛交99久久久久99按摩| 欧美日韩一区二区在线播放| 国产精品www.| 久久精品电影| 久久久久国产精品人| 国模私拍一区二区三区| 亚洲欧洲一区二区在线播放| 久久久久88色偷偷免费| 激情欧美国产欧美| 亚洲视频在线观看一区| 欧美日本乱大交xxxxx| 久久九九久精品国产免费直播| 一本大道久久a久久精品综合| 欧美一区在线直播| 欧美午夜视频在线观看| 久久综合电影| 亚洲美女色禁图| 老妇喷水一区二区三区| 国产手机视频一区二区| 亚洲精品一区中文| 亚洲精选大片| 国产日韩精品一区二区浪潮av| 国产偷国产偷精品高清尤物| 在线视频欧美日韩精品| 欧美多人爱爱视频网站| 久久色在线播放| 日韩亚洲欧美一区二区三区| 欧美片在线播放| 欧美日韩一二区| 亚洲国产女人aaa毛片在线| 国产精品igao视频网网址不卡日韩| 亚洲欧美日韩区| 夜夜狂射影院欧美极品| 国产精品久久久久久久午夜| 国产精品无人区| 欧美在线播放视频| 另类天堂视频在线观看| 牛夜精品久久久久久久99黑人| 国产精品爱久久久久久久| 一本久久综合| 激情综合色综合久久综合| 亚洲欧美视频在线| 亚洲欧洲三级| 欧美好吊妞视频| 国产精品久久久久久久久动漫| 伊人久久亚洲美女图片| 亚洲欧美日韩视频一区| 国产一区二区三区久久悠悠色av| 国产精品国产亚洲精品看不卡15| 影音先锋亚洲精品| 亚洲欧美一区二区精品久久久| 日韩午夜高潮| 欧美日韩亚洲激情| 精品动漫3d一区二区三区免费| 国产精品欧美一区喷水| 欧美成人综合在线| 久久综合九色综合欧美就去吻| 免费在线观看精品| 亚洲精品日韩激情在线电影|