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

數據密集型應用在NVIDIA Fermi片內存儲結構上的適應性分析*

2014-09-29 08:32:50任秀江張清波陳芳園
計算機工程與科學 2014年4期
關鍵詞:指令

舒 兵,任秀江,張清波,陳芳園

(江南計算技術研究所,江蘇 無錫 214083)

1 引言

微處理器的發展已經進入了眾核時代,NVIDIA的通用圖形處理器(GPGPU)是典型的GPU眾核架構,它在片上集成了大量簡單的計算核心,通過簡單運算部件的聚合提供超高計算性能。NVIDIA的Fermi[1]、Kepler[2,3]架 構 的 處 理器等是其中的典型代表。GPGPU大量的計算核心提供了并行加速的能力,適合數據的并行處理。隨著2007年NVIDIA統一軟件并行編程模型CUDA[4,5]的 推 出,在NVIDIA GPU上 的 應 用 與研究越來越多,廣泛涉及生物、物理、天文、信號、醫藥、勘探等各個科學研究和工程領域。NVIDIA GPU的片上存儲結構比較復雜,包括Register File和多級Cache結構以及Shared Memory等,這種復雜的存儲結構可有效提升GPU對應用的適用性。

統計資料表明,眾多科學領域的數據量隨時間呈指數增長,且基數較大。以科學研究為例,生物醫學、天文觀測、信號處理、互聯網絡等等研究領域每年都會產生PB甚至ZB量級的數據,并且還在以指數函數的速度增長。除了數據量大的特點,這一類的數據一般還具有非結構化、可分性好、復用率較低、實時性要求等等特點。具有上述特點的應用可稱之為數據密集型應用,對于數據密集型應用的處理大多集中在檢索、查詢、分析與挖掘這些方面,統稱為數據密集型計算DIC(Data Intensive Computing)。數據密集型應用的計算訪存比相對偏低,存儲器操作成為應用性能的瓶頸,處理這類應用的重點在于數據的存儲和傳輸。未來是數據的時代,數據密集型應用將占據越來越重要的比例,從處理器存儲架構方面提升該類應用的性能具有現實意義。

本文主要通過分析數據密集型典型應用自身的數據特點及其在GPU上的數據映射關系,通過GPGPU-SIM所模擬的NVIDIA GT200、Fermi這兩種架構上的應用表現分析GPU存儲結構對該類應用的影響,對適應數據密集型應用的GPU眾核處理器存儲層次設計提出了建議,進而為通用眾核處理器存儲層次優化提供參考。

2 Fermi架構及GPGPU-SIM介紹

2.1 Fermi的整體架構

Fermi架構的CUDA核心數高達512個。512個CUDA核心組成16個流式多核處理器(SM),每個SM包含32個CUDA核心。芯片內部還包含六個64位的DRAM通道,每個通道的訪存帶寬約為32GB/s。GigaThread全局調度器負責分配線程塊給SM。

2.2 Fermi的SM結構

SM中的計算核心分為四組,其中兩組是流處理器陣列,每組包含16個CUDA Core,另外一組由16個load/store單元組成,還有一組四個特殊功能單元。另外,Fermi架構添加了對完整IEEE754-2008標準的支持,多個核心協同支持雙精度浮點運算。

SM中,連續編號的32個并行線程組成一個warp,作為線程調度單元。每個SM擁有兩個warp調度器和兩個指令調度單位,并且兩個warp可以同時執行和處理。Fermi的雙warp調度器支持同時選擇兩個warp,并從每個warp向16個CUDA核心、16個加載/存儲單元,或四個SFU發出操作指令。因為warp是獨立執行的,Fermi的調度器并不需要檢查指令流內的依賴性。使用雙warp調度模型,Fermi可獲得接近峰值的硬件性能。

為與SM中計算單元的數目增多相適應,Fermi架構中單SM中的寄存器文件規模也有了相應的增加,從GT200中的16 384個增加到了32 768個。由于CUDA編譯器通常為每個線程分配10~20個寄存器[6],因而更多的寄存器通常意味著SM上可同時運行更多的線程,硬件的利用率也就更加充分。G80和GT200的每個SM都有16 KB的共享存儲器SMEM(Shared MEMory)。在Fermi架構中,每個SM擁有64KB的片上存儲空間,可以配置成48KB的SMEM和16KB的L1 Cache、或16KB的SMEM和48KB的L1Cache。L1Cache與Shared Memory的可配置關系增加了編程的靈活性和對應用的適應性,是在GT200基礎上的一項重要創新。Fermi的L2Cache大小為768KB,由所有的SM所共享。

2.3 GPGPU-SIM介紹

GPGPU-SIM[7]于2007年由Fung W等人研發,它是一款時序精確的GPU性能模擬器。它模擬了NVIDIA統一架構GPU,并且對G80、GT200、Fermi等都有很高的模擬精度,針對不同型號的GPU都有相應的配置文件,參數修改方便。軟件方面,這款模擬器配合CUDA編程模型,很好地支持了PTX(Parallel Thread eXecution)虛擬指令集和OpenGL。

與硬件結構相對應,GPGPU-SIM的功能模塊由三個部分組成:著色器SC(Shader Core)、互連網絡(Interconnection Network)以及存控(Memory Controller)。著色器核心通過片上互連網絡連接到各個存儲模塊(存控)。

3 實驗模擬及數據分析

3.1 應用選取

結合數據密集型應用的特點,本文選取訪存指令占總指令百分比在20%以上的應用作為數據密集型應用的典型代表。為使測得的訪存指令百分比具有代表性和滿足數據密集型應用訪存密集的特點,本文對應用程序的總指令數也設置了一個標準——1M條以上。

本文選取的應用均來自于GPGPU-SIM v3.1.1的基準測試程序[8]及CUDA SDK3.1[9]的程序。根據應用領域及其計算訪存比的特點,選取如下六個應用程序作為典型算法進行分析:

(1)高級加密標準AES;(2)離散余弦變換DCT;(3)快速沃爾什變換FWT;(4)拉普拉斯變換LPS;(5)矩陣乘MatrixMul;(6)神經網絡算法NN。

上面選取的六個應用程序分別涉及密碼、圖像、信號、數學等各個科學計算領域,較全面地涵蓋了數據密集型應用的范疇,根據數據密集型應用的特點,本文設定訪存總指令數大于1M、訪存百分比為20%以上的應用屬于數據密集型應用,刪選的結果即如表1所示。

Table 1 Basic parameters of programs表1 選取的應用程序基本參數

根據指令所使用的存儲部件不同,對應用程序的存儲指令進行分類統計,如圖1所示。圖中“Param”指的是通過GPU內核call傳輸的參數,即所謂的Cache命中。

Figure 1 Sort instruction in programs圖1 應用程序存儲指令分類

3.2 數據密集型應用在可配置的L1Cache/SMEM上的適應性分析

可配置的L1Cache和Shared Memory結構是Fermi存儲層次最大的亮點,給編程帶來了較大的靈活性,也增加了Fermi結構對應用的適應性和通用性。通過圖1對應用程序存儲指令的分類,可以看出除NN外,另外幾種應用都與Shared Memory有密切的關系。本節選取了SMEM分別為16KB、32KB、48KB和64KB四種情況,其中SMEM為48KB是基礎情況。測試結果進行歸一化得到應用加速比,如圖2所示。

測試結果顯示,有些應用對共享存儲器(或L1 Cache)大小并不敏感,如FWT和DCT;而有的程序在共享存儲器和L1Cache處于某些配置時性能最好,其他配置下性能下降,如LPS;還有一些應用隨Shared Memory的變化呈現遞增或遞減的變化,如MatrixMul和AES。下面逐一分析這六個應用程序性能變化與硬件存儲架構的關系。

(1)AES。

Figure 2 Speedup under different SMEM configurations圖2 不同SMEM配置下應用程序加速比

根據圖1中AES存儲指令的分類可以看到,AES有80%的存儲指令來自于SMEM,另外近20%的指令是訪問Constant Memory和Texture Memory,訪問Local Memory和Global Memory的諸如Load、Store等操作幾乎可以忽略,而L1 Cache、L2Cache主要服務于Load、Store等操作,因此L1Cache、L2Cache對AES的影響幾乎可以忽略。其次,UByte4所占的字節數為4+1×4=8,Shared Memory需要的存儲空間大小為256×8×6=12KB。SMEM大于12KB就可以滿足程序的要求,所以SMEM增大,AES性能變好,但當SMEM達到32KB或以上時,SMEM再增大時AES性能基本不變。

對于AES在SMEM為較小的16KB時,性能也達到了288.741 9,一方面是因為16KB的SMEM已經基本滿足12KB的應用程序需求;另一方面,本模擬采用的是L1Cache和SMEM總和固定,L1Cache容量也能起到SMEM容量補充的作用。因此,在16KB配置下,性能還是比較高的。

(2)DCT。

該應用的性能都隨SMEM的增大有輕度的下降。DCT只需要兩個8×8Blocks的Shared Memory存儲空間,即8×8×2×4=1KB(CUDA中一個單精度浮點數據占四個字節)。測試的SMEM配置中SMEM大小對該應用程序是足夠的,所以SMEM的增大對應用程序的影響幾乎可以忽略。但是,SMEM增大的同時L1Cache隨之減小,這個應用有一定量的Load/Store和Param指令(約12%),這些指令對L1Cache有一定的依賴性。因此,L1Cache的減小會導致這兩個應用程序性能的損失,但這種損失被大容量的L2 Cache所彌補,因此最后表現出的現象是性能的微幅下降。

(3)FWT。

FWT一條線程負責四個數據為一組的基-4 FWT計算(加減運算),程序中輸入數據的規模是223個浮點數據,共享存儲器中以一個基-4FWT的四個輸入數據的首地址索引進行存儲,占一個單精度浮點的存儲空間。因此,共需要221×4B=8MB的存儲空間才能一次性加載所有輸入數據。但是Fermi的SMEM最大為64KB,遠遠小于8MB。因此,Fermi采用分塊存取。Fermi一次流水調度兩個warp(雙warp調度),一個warp有32個線程,一個線程需要存儲一個float數據(一組的四個數據的首地址),所以雙warp需要讀取64×4B=256B的數據,這個大小遠小于SMEM最小情況的16KB。每次流水線從全局存儲器拷貝256B的數據塊到SMEM,并且通過預取傳送可以達到隱藏訪存延遲的目的;另外,存入共享存儲器中的原始數據經過計算之后原位存儲,這樣達到了存儲空間的最大化利用,并且大量的Load/Store(40%)操作擁有較高的Cache命中(Param),這也對FWT的性能起到了積極的作用。上述兩個因素是FWT性能不隨SMEM明顯變化并且其IPC可以達到較高水平的根本原因。

(4)LPS。

當SMEM為32KB或48KB時,LPS性能最好;而SMEM為64KB(沒有L1Cache)或者SMEM為16KB時,LPS性能損失達到35%~38%。LPS使用SMEM存儲空間,共需(32+2)×(4+2)×3×4≈2.4KB共享存儲器空間。所以,SMEM不是應用性能的限制因素,SMEM為64KB時,沒有L1Cache,LPS有35%左右的Load/Store和Param指令,L1Cache的缺失勢必導致LPS性能的下降,而且下降的幅度恰好接近35%,與存儲指令的分類數據完全吻合;SMEM為16KB時,L1Cache大小為48KB,此時兩個存儲結構大小完全滿足需求。但是,LPS性能仍然下降,這是因為L1Cache較大時,GPU需要花費較多的額外周期,以完成管理Cache等操作,而且L1 Cache越大,這種額外開銷越明顯,因此體現在性能上為IPC下降。

(5)MatrixMul。

該應用的表現與DCT比較類似,性能隨SMEM增大而微幅下降。因為MatrixMul需要兩個16×16的Blocks的存儲空間,用于存儲兩個相乘矩陣的塊數據,因此需要的存儲空間為:16×16×2×4=2KB。SMEM大小足夠滿足應用程序的需求,但6%的Load/Store以及Param操作使得IPC隨L1Cache減小而下降,同時大容量L2 Cache會縮小這種變化,所以性能表現出微幅下降。MatrixMul與DCT不同之處在于MatrixMul的絕對IPC很低,原因在于該應用的CUDA程序是與GT200相適應的,當在Fermi上運行時,Fermi存儲部件結構不同造成對齊訪問機制失效,產生了嚴重的Bank沖突,因此IPC非常低下。

(6)NN。

該應用比較特殊,它沒有與Shared Memory的交互操作,它的存儲指令有97%屬于Load/Store和Param操作(其中Load指令就占近80%),剩下的3%左右是Constant Memory的訪存操作,所以當把L1Cache取消時,NN的IPC性能只有原來的20%,其他情況下L1Cache都大于或等于16KB,完全滿足要求,因此性能基本不變。可以預見,當L1Cache低于某一臨界值時,隨著L1Cache的減小,NN的性能將會有顯著的損失,這是因為此時L1Cache成為其性能的主要限制因素。另外,NN的IPC非常低,只有35左右。與MatrixMul的性能低下原因不同,NN性能較低是因為包含大量(80%)的Load操作,此類操作與片外存儲部件交互,延遲很高,達到了400~500個cycles,因此性能非常差。

3.3 數據密集型應用在可配置的L2Cache上的適應性分析

L2Cache由所有SM所共享,通過片內互連網絡與DRAM連接,主要用于緩存從Global Memory中獲取的數據。當SM需要讀取輸入數據時,首先從L1Cache中查找,若未命中,則到L2 Cache中查找,L2Cache未命中才會從Global Memory中讀取。L1Cache和L2Cache的命中率一般都可以達到80%左右,作為片內存儲器,L2 Cache一般采用訪問速度較快的SRAM設計,訪存速度遠快于片外存儲器,且容量一般比L1 Cache大得多,彌補了L1Cache容量不足和DRAM訪問速度慢的缺點。為了測試L2Cache對數據密集型應用的影響,實驗中選取了L2容量從0到1 536KB等多個大小,其中L2Cache為768KB是基礎情況。歸一化后的結果如圖3所示。

L2Cache作為連接DRAM和L1Cache的紐帶,補充了DRAM訪問延遲高和L1Cache容量小的缺點。從測試的結果來看,各個應用都對L2 Cache有一定的性能表現,其中DCT、FWT、LPS和NN的曲線相對比較明顯,AES和MatrixMul則對L2Cache不太敏感。具體的原因做如下分析:

(1)AES和MatrixMul。

Figure 3 Speedup under different L2configurations圖3 不同L2配置下應用程序加速比

從圖3可以看出,這兩個應用對L2Cache不太敏感。主要是因為這兩種應用的存儲指令絕大多數為Shared Memory的讀寫指令,其中AES的這類指令占到了總存儲指令的80%,而Matrix-Mul則高達近95%,這兩種應用是六個應用中Shared Memory指令所占百分比最高的兩種。這種指令分布決定了它們對L2Cache乃至L1 Cache都不敏感,但這兩類應用畢竟存在少量的Load/Store以及Param指令,所以當取消L2 Cache時,它們的性能又會有所下降,并且下降幅度隨這三類指令所占百分比呈線性遞減。

(2)DCT和NN。

DCT和NN的性能隨著L2Cache從無到有、從小到大在宏觀上呈現出增長的趨勢。這與它們的Load/Store、Param指令所占百分比較高有直接關系。比如,DCT的這類指令占到了23%多,NN的這類指令占到了90%以上,所以這兩種應用是六個應用中對L2最敏感的應用。在細節方面,DCT的IPC在L2Cache低于192KB時處于低水平平緩狀態,達到768KB時增幅較大,此后L2 Cache增大,其性能依然上升;而NN則隨著L2 Cache增大性能平緩上升,在L2Cache超過768KB后性能保持穩定不變。造成這種現象的原因與它們的存儲指令數量有關,如表2所示。

Table 2 Load/Store、Param instructions of DCT and NN表2 DCT和NN的Load/Store、Param指令

DCT的Load/Store、Param指令是NN的三倍多,并且兩者都是對單精度浮點數據進行操作。更多的存儲指令需要更大的Cache才能達到較高的命中率。所以,L2Cache較小時,對DCT的影響比較小,并且處于一個較低的水平,而對NN而言,L2Cache較小時就可以比較明顯地影響其性能;當L2Cache增大到一定程度時,L2Cache對DCT的影響開始凸顯,隨L2Cache增大其性能也明顯提升,而對于NN,L2Cache漸漸達到飽和,所以其性能趨于平緩。

(3)FWT和LPS。

這兩種應用的性能表現有一定相似性,當L2 Cache不存在或者L2Cache較大(大于或等于768KB)時,其性能都是最高的,而當L2Cache處于中間值時,兩者的性能都有一定的損失,如L2 Cache為24KB時,FWT相比于基礎情況性能損失了13.4%,LPS損失了7.3%。L2Cache為0時,L1Cache完全可以滿足Load/Store等指令的需求,并且節省了L2Cache的管理開銷,因而性能沒有降低;當L2較小時,如24KB,L1Cache與L2 Cache的大小處于同一個數量級,也就是說,L1 Cache只能部分映射到L2Cache,這樣會導致大量的MISS,直接影響應用的性能,這就是為什么L2 Cache從無到有時,性能不升反降的原因。

L2Cache的大小主要與工藝有關,由于L2 Cache結構比DRAM要復雜得多,因此成本很高,在芯片上所占的面積也很大,因此一般片上二級Cache容量不能做得很大,Fermi的L2Cache大小為768KB,平均每個SM可分攤約50KB的L2 Cache;最新的Kepler架構擁有1 536KB的統一L2Cache,每個SM可分攤約100KB的L2Cache,相比于Fermi整整提高了一倍,但是Kepler的核心數目是Fermi核心數目的6倍。所以,GPU核心計算能力的提升和二級Cache層次的存儲容量提升是不匹配的,存儲不能匹配計算。另外,Fermi或Kepler每個SM分攤的L2Cache容量與片上L1Cache與SMEM總體容量相比遠沒有達到數量級的提升,其二級存儲容量對一級存儲容量的包容不是很明顯,因此本實驗數據從總體上看,L2大小從0到1 536KB,六個應用性能變化總體不是很大。

4 結束語

本文通過對六個數據密集型應用在NVIDIA的GT200、Fermi、Kepler三代GPGPU上的大量實驗,對比了不同存儲結構設計對數據密集型應用性能的影響。通過分析,對于數據密集型應用的GPU眾核存儲層次優化提出一些建議:

(1)對于數據密集型應用,L1Cache/SMEM、L2Cache和片上存儲器(紋理Cache、常量Cache等)的總容量是至關重要的,隨著集成電路工藝的進步,片上存儲的容量需要不斷提升。

(2)從Fermi到Kepler的體系結構的變化來看,片內存儲容量的擴大沒有很好地與片內計算性能的提升相匹配,甚至有若干倍的差異,這種差異達到一定程度會對某些數據密集型應用的性能產生較大的影響。所以,隨著片上計算性能的提升,單位計算所得到的片上存儲容量需要得到進一步重視。

(3)GPU的訪存事務(合并訪問機制)就是通過多個線程同時訪問存儲空間的同一個Bank達到隱藏訪存延遲的目的,對于數據量較大,SMEM不夠滿足一次性加載所有輸入數據的數據密集型應用(例如FWT),分塊存取和預取技術可以很好地隱藏訪存延遲并且實現SMEM的最大化利用。

(4)應用開發以及性能優化與硬件結構是密不可分的,應用程序需要契合存儲層次進行合理的代碼設計。對于數據密集但規則訪問的一些應用,采用片上存儲器模式(SMEM)而不是Cache模式,可以使應用開發者更容易進行性能優化。

(5)考慮到眾核或GPU的可編程性,對于一些數據密集但不規則的應用,創新存儲層次與Cache設計,可以提高其適應性。Fermi提出的可配置L1Cache/SMEM是一個偉大的創新,同時在Kepler架構上進一步提高了二級Cache的容量,這些都對擴展GPU的適應性、開放性和可編程性十分有益。

[1] NVIDIA Corporation.NVIDIA’s next generation CUDA compute architecture:Fermi[Z].Version 1.1.2009.

[2] NVIDIA Corporation.GeForce GTX 680:The fastest,most efficient GPU ever built[Z].Version 1.0.2012.

[3] NVIDIA Corporation.NVIDIA’s next generation CUDA compute architecture:Kepler GK110—The fastest,most efficient GPU ever built[Z].Version 1.0.2012.

[4] NVIDIA Corporation.NVIDIA CUDA reference manual[Z].Version 3.2Beta.2010.

[5] NVIDIA Corporation.NVIDIA CUDA API reference manual[Z].Version 4.2.2012.

[6] Cai Jing.GPGPU architecture key technology demonstration and simulator research and extension[D].Changsha:National University of Defense Technology,2009.(in Chinese)

[7] Aammodt M,Bakhoda A,Fung W.Tutorial on GPGPU-Sim:A performance simulator for massively multithreaded processor research[C]∥Proc of the 42nd Annual IEEE/ACM International Symposium on Microarchitecture,2009:1.

[8] Che Shuai,Boyer M,Meng Jia-yuan,et al.A benchmark suite for heterogeneous computing[C]∥Proc of IEEE International Symposium on in Workload Characterization,2009:1.

[9] NVIDIA Corporation.NVIDIA CUDA SDK3.1code samples[EB/OL].[2011-05-16].http://docs.nvidia.com/cuda/cuda-samples/index.html.

附中文參考文獻:

[6] 蔡晶.GPGPU體系結構關鍵技術論證及模擬器研究與擴展[D].長沙:國防科學技術大學,2009.

猜你喜歡
指令
聽我指令:大催眠術
ARINC661顯控指令快速驗證方法
測控技術(2018年5期)2018-12-09 09:04:26
LED照明產品歐盟ErP指令要求解讀
電子測試(2018年18期)2018-11-14 02:30:34
殺毒軟件中指令虛擬機的脆弱性分析
電信科學(2016年10期)2016-11-23 05:11:56
巧用G10指令實現橢圓輪廓零件倒圓角
時代農機(2015年3期)2015-11-14 01:14:29
中斷與跳轉操作對指令串的影響
科技傳播(2015年20期)2015-03-25 08:20:30
基于匯編指令分布的惡意代碼檢測算法研究
一種基于滑窗的余度指令判別算法
歐盟修訂電氣及電子設備等產品安全規定
家電科技(2014年5期)2014-04-16 03:11:28
MAC指令推動制冷劑行業發展
汽車零部件(2014年2期)2014-03-11 17:46:27
主站蜘蛛池模板: 国产久操视频| 亚洲成在人线av品善网好看| 久久综合丝袜日本网| 亚洲人成在线精品| 日韩123欧美字幕| 国产一区成人| 波多野结衣亚洲一区| 69综合网| 女同久久精品国产99国| 亚洲av无码久久无遮挡| 欧美乱妇高清无乱码免费| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲日本中文字幕乱码中文| 超清无码一区二区三区| A级全黄试看30分钟小视频| 小说区 亚洲 自拍 另类| 99热这里只有免费国产精品 | 国产精品吹潮在线观看中文| 毛片视频网| 日韩人妻少妇一区二区| 99re这里只有国产中文精品国产精品 | 99视频精品在线观看| 99人妻碰碰碰久久久久禁片| 久久精品电影| 欧美yw精品日本国产精品| 日韩在线视频网| 国产精品99久久久| 一级毛片在线播放| 五月天久久综合| 国产福利在线免费| 天天干伊人| av色爱 天堂网| 热久久这里是精品6免费观看| 99人体免费视频| 欧美一区二区人人喊爽| 国产三级国产精品国产普男人 | 午夜毛片福利| 亚洲精品人成网线在线| 亚洲精品天堂自在久久77| 国产91精选在线观看| 精品久久久久久成人AV| 91系列在线观看| 片在线无码观看| 特级aaaaaaaaa毛片免费视频| 在线观看欧美国产| 高潮毛片无遮挡高清视频播放| 国产经典在线观看一区| 亚洲成人动漫在线| 国产福利拍拍拍| 九九热在线视频| 中文纯内无码H| 婷婷成人综合| 国产精品无码一二三视频| 日韩亚洲综合在线| 国产午夜无码片在线观看网站| 中文字幕亚洲第一| a在线亚洲男人的天堂试看| 色天天综合久久久久综合片| 日本日韩欧美| 日韩中文字幕免费在线观看 | 亚洲浓毛av| 在线观看91精品国产剧情免费| 91区国产福利在线观看午夜| 91久久夜色精品国产网站| 热re99久久精品国99热| 国产va在线观看免费| 日本黄网在线观看| www精品久久| 国产屁屁影院| 1024你懂的国产精品| 国产精品永久久久久| 精品91自产拍在线| 亚国产欧美在线人成| 久99久热只有精品国产15| 成年人国产网站| 亚洲黄色网站视频| 久久久久国产一级毛片高清板| 91精品免费高清在线| 国产办公室秘书无码精品| 久青草免费视频| 自拍偷拍欧美| 亚洲不卡无码av中文字幕|