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

基于GPU的高效并行l(wèi)1最小化算法

2016-11-18 09:29:31高家全李澤界

高家全,李澤界

(浙江工業(yè)大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,浙江 杭州 310023)

?

基于GPU的高效并行l(wèi)1最小化算法

高家全,李澤界

(浙江工業(yè)大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,浙江 杭州 310023)

多數(shù)l1最小化算法主要由稠密矩陣矢量乘(如Ax和ATx)和矢量運(yùn)算組成.為使其適應(yīng)大數(shù)據(jù)環(huán)境下的性能需求,基于GPU,利用其新的特征,提出了兩個(gè)新穎的基于GPU的并行矩陣矢量乘.這兩個(gè)算法實(shí)現(xiàn)了全局內(nèi)存的合并訪問(wèn),對(duì)任意給定矩陣,通過(guò)所使用的自適應(yīng)分配線程數(shù)或warp數(shù)的策略,增加了魯棒性.基于這兩個(gè)算法,并以兩個(gè)流行的l1最小化算法為例:快速迭代收縮閾值算法(FISTA)和增廣拉格朗日乘子法(ALM),提出了兩個(gè)高效基于GPU的并行l(wèi)1最小化算法.實(shí)驗(yàn)結(jié)果驗(yàn)證了提出的算法是高效的,并有良好的性能.

l1最小化;GPU;矩陣矢量乘;FISTA;ALM

l1最小化問(wèn)題為min‖x‖1,須滿足Ax=b,其中A∈(Rm×n(m?n)是一個(gè)滿秩的稠密矩陣,b(Rm是預(yù)先設(shè)定的矢量,x∈(Rn是未知解.l1最小化問(wèn)題的解,也稱為稀疏表達(dá),已經(jīng)廣泛應(yīng)用到多個(gè)領(lǐng)域,例如信號(hào)處理[1-2],機(jī)器學(xué)習(xí)[3]和統(tǒng)計(jì)推理[4]等.為了解決l1最小化問(wèn)題,研究者已開發(fā)出許多有效的算法.例如,梯度投影法[5],截?cái)嗯nD內(nèi)點(diǎn)法[6],同倫法[7],迭代收縮閾值法[8],增廣拉格朗日乘子法(ALM)[9]等.隨著問(wèn)題規(guī)模的增長(zhǎng),算法的執(zhí)行效率很大程度上被消減.為提高其效率,一個(gè)有效的途徑就是將這些算法移植到分布式或多核的架構(gòu)上,例如目前流行的圖形處理單元(GPU).自從NVIDIA公司在2007年[10]介紹了CUDA編程模型以來(lái),基于GPU加速數(shù)據(jù)處理的研究已成為人們研究的熱點(diǎn)[11-12].

大多數(shù)l1最小化算法,其運(yùn)算主要由稠密的矩陣矢量乘和矢量操作組成.由于CUBLAS庫(kù)[13]中已包含這些運(yùn)算的高效實(shí)現(xiàn),所以現(xiàn)有基于GPU加速的l1最小化算法[14]主要基于CUBLAS庫(kù).然而,在GTX980顯卡上,對(duì)CUBLAS實(shí)現(xiàn)的矩陣矢量乘進(jìn)行了測(cè)試,發(fā)現(xiàn)其會(huì)產(chǎn)生性能波動(dòng),隨著行數(shù)或者列數(shù)的增長(zhǎng),且最大最小性能差距顯著.因此,本研究基于GPU,針對(duì)Ax(GEMV)和ATx(GEMV-T),分別提出一個(gè)自適應(yīng)warp分配策略的GEMV核和thread分配策略的GEMV-T核.實(shí)驗(yàn)結(jié)果顯示:該方法比CUBLAS更加魯棒,而且總能保持高性能.基于GEMV核和GEMV-T核,以快速迭代收縮閾值算法FISTA和增廣拉格朗日乘子法ALM為例,利用內(nèi)核融合和新的GPU特性,例如洗牌指令(The shuffle instruction)和只讀數(shù)據(jù)內(nèi)存,提出了兩個(gè)高效的基于GPU的并行l(wèi)1最小化算法.該研究工作的主要貢獻(xiàn):1) 提出了兩種新穎的基于GPU的并行稠密矩陣矢量乘算法;2)利用內(nèi)核融合技術(shù)和新的GPU特性,并基于所提出的并行稠密矩陣矢量算法思想,實(shí)現(xiàn)了兩個(gè)高效的并行l(wèi)1最小化算法;3)通過(guò)實(shí)驗(yàn),驗(yàn)證了方法的有效性.

1 兩個(gè)l1最小化算法

1.1 快速迭代收縮閾值算法

l1最小化問(wèn)題也被稱為基追蹤問(wèn)題(The basis pursuit problem).在實(shí)際中,一個(gè)測(cè)量數(shù)據(jù)b經(jīng)常含有噪聲(例如測(cè)量誤差ε),這個(gè)被稱為BPDN問(wèn)題.它的一個(gè)變異被稱為攜帶標(biāo)量λ的無(wú)約束BPDN問(wèn)題:

(1)

快速迭代收縮閾值算法[8](FISTA)是通過(guò)結(jié)合Nesterovs最優(yōu)梯度算法實(shí)現(xiàn)的一個(gè)加速版本,擁有非漸進(jìn)的收斂率O(k2).對(duì)于FISTA,它添加了一個(gè)新的序列{yk,k=1,2,…,n},即

(2)

式中:soft(u,a)=sign(u)·max{|u|-a,0}為軟閾值算子;y1=x0;t1=1;Lf為▽f(·)關(guān)聯(lián)的李普希茨常數(shù),可由計(jì)算ATA的特征譜得到(‖ATA‖2).

1.2 增廣拉格朗日乘子法

增廣拉格朗日乘子法[9](ALM)結(jié)合罰函數(shù)法和拉格朗日乘子法,對(duì)應(yīng)增廣拉格朗日函數(shù)為

Lρ(x*,λ)=‖x‖1+λT(Ax-b)+

(3)

式(3)可以通過(guò)迭代求解,即

(4)

式中{ρk}為單調(diào)遞增的正序列.通過(guò)式(4),可以同時(shí)求解最優(yōu)解x*和λ*.式(4)的第一步稱為x最小化,它是一個(gè)凸優(yōu)化,可以通過(guò)FISTA求解.

2 CUDA架構(gòu)

CUDA是一個(gè)通用的并行計(jì)算平臺(tái)和編程模型.開發(fā)者可以使用CUDA C/C++定義函數(shù)(稱為內(nèi)核),并通過(guò)CUDA線程并行執(zhí)行這些內(nèi)核.一個(gè)GPU擁有眾多的計(jì)算核心,稱為CUDA核心;這些核心被組織成一個(gè)可擴(kuò)展的流多處理器(SM)的陣列.一個(gè)SM可以并行地執(zhí)行成千上百個(gè)線程.當(dāng)一個(gè)線程塊被分配給一個(gè)SM,它又被劃分為多個(gè)warp,每個(gè)warp擁有32個(gè)線程.最理想的情況,當(dāng)這32個(gè)線程具有相同的執(zhí)行路徑時(shí),指令執(zhí)行效率最高.

GPU內(nèi)存包括片上內(nèi)存,如共享內(nèi)存和L1緩存,和板載內(nèi)存,如全局內(nèi)存.全局內(nèi)存容量最大,并被所有SM共享,然而由于全局內(nèi)存位于片外的板載DRAM,其低帶寬和高延遲經(jīng)常導(dǎo)致存取訪問(wèn)慢.共享內(nèi)存被同一個(gè)線程塊內(nèi)的所有線程共享,提供高帶寬和低延遲,但容量小.L1緩存和只讀數(shù)據(jù)緩存被同一個(gè)SM內(nèi)的所有線程共享,且存取速度能與共享內(nèi)存一樣快.相比不可控的L1緩存,只讀數(shù)據(jù)緩存是可控的,容易被利用.

3 GPU實(shí)現(xiàn)

3.1 魯棒的矩陣矢量乘

本節(jié)提出兩個(gè)矩陣矢量乘內(nèi)核,包括Ax(GEMV)和ATx(GEMV-T),其中A∈Rm×n.這里使用以0開始索引的按行存儲(chǔ)方式來(lái)存儲(chǔ)矩陣A,并利用填充策略優(yōu)化全局內(nèi)存訪問(wèn)性能,從而提高了訪問(wèn)效率.

3.1.1 GEMV核

Ax(GEMV)運(yùn)算由m個(gè)內(nèi)積組成(每個(gè)內(nèi)積為A的一行和x相乘),且每個(gè)內(nèi)積是獨(dú)立的.因此,在設(shè)計(jì)GEMV核時(shí),可分配一個(gè)warp或者多個(gè)warp去計(jì)算一個(gè)內(nèi)積.為優(yōu)化GEMV核的性能,本研究提出如下的自適應(yīng)warp分配策略,選取k個(gè)warp計(jì)算一個(gè)內(nèi)積為

minw=sm×2 048/(k×32)m≤w

(5)

式中:sm為流多處理器的數(shù)目;m為矩陣的行數(shù).GEMV內(nèi)核偽代碼描述為

輸入:A,x,k,h,m,n;

輸出:b;

1. __shared__xP[],bP[];

2. bVAL←0.0f;

3. lane←threadIdx.x&31; wid←threadIdx.x>>5;

4. wgSize←32×k; wgid←threadIdx.x/wgSize;

5. hub←threadIdx.x&(wgSize-1);

6. row←blockIdx.x×h+wgid;//行索引分配

7. for row tom-1 with row+=h×gridDim.x

//第一個(gè)階段

8. bVAL←0; Aid←row×n+hub;

9. for xid=threadIdx.x ton-1 with xid+=blockDim.x

//x-load步

10.xP[threadIdx.x]←x[xid];

11. __syncthreads();

//partial-reduction步

12. fori=hub to blockDim.x-1 withi+=wgSize

13. bVAL←bVAL+A[Aid]×xP[i];

14.Aid←Aid+wgSize;

15.end

16.__syncthreads();

17.end

//warp-reduction步

18. 使用洗牌指令完成warp內(nèi)的歸約操作

19.iflane==0 bP[wid]←bVAL;

20.__syncthreads();

//第二個(gè)階段

21.ifwid==0

22.bVAL←bP[lane];

23. 使用洗牌指令完成warp內(nèi)的歸約操作

24.iftid%k==0 b[row+threadIdx.x/k]←bVAL;

25.end

26.end

GEMV內(nèi)核的主要步驟包括兩個(gè)階段,第一個(gè)階段有三個(gè)步驟:x-load步,partial-reduction步和warp-reduction步.在x-load步中,一個(gè)線程塊的所有線程并行地讀取矢量x的每個(gè)元素到共享內(nèi)存xP.因?yàn)閤的尺寸很大,所以x被分塊讀進(jìn)共享內(nèi)存,大小為線程塊尺寸.通過(guò)上述方式,保證了x的訪問(wèn)是合并的,并且通過(guò)共享x的片段,減少了訪問(wèn)次數(shù).在partial-reduction步中,每次完成x片段的加載后,同一個(gè)warp組(k個(gè)warp組成一個(gè)warp組)內(nèi)所有線程并行地執(zhí)行x的部分歸約操作(詳見程序描述的12~15).顯然,每個(gè)線程最多執(zhí)行|n/wgSize|(n為矩陣A的列數(shù),wgSize為warp組內(nèi)線程數(shù))次歸約操作,并且對(duì)于訪問(wèn)全局內(nèi)存上的矩陣A也是合并的.然后,使用洗牌指令實(shí)現(xiàn)warp-reduction步(warp內(nèi)歸約操作),并將結(jié)果存在共享內(nèi)存上.

在第二階段,將warp-reduction步的結(jié)果歸約為最終的輸出.當(dāng)k=1時(shí),一個(gè)warp組只有一個(gè)warp.只需要第一個(gè)階段,便可將結(jié)果輸出(因?yàn)槠耸÷?.同時(shí),對(duì)于k=32的情況,由于不需要加載矢量x到共享內(nèi)存,可直接將x加載到寄存器,所以需一個(gè)新核(因?yàn)槠摵耸÷?.

3.1.2 GEMV-T內(nèi)核

ATx(GEMV-T)運(yùn)算由n個(gè)內(nèi)積組成(每個(gè)內(nèi)積為A的一列和x相乘),且每個(gè)內(nèi)積是獨(dú)立的.由于GEMV-T中的矢量x尺寸較小,所以在設(shè)計(jì)GEMV-T核時(shí),可分配一個(gè)線程或者多個(gè)線程去計(jì)算一個(gè)內(nèi)積.為優(yōu)化GEMV-T核性能,本研究提出如下的自適應(yīng)thread分配策略,選取k個(gè)線程計(jì)算一個(gè)內(nèi)積為

mint=sm×2 048/kn≤t

(6)

式中:sm為流多處理器的數(shù)目;m為矩陣的行數(shù).GEMV-T內(nèi)核偽代碼描述為

輸入:A,x,k,h,m,n;

輸出:b;

1.__shared__xP[], bP[];

2.bVAL;

3.wid←threadIdx.x>>5;lane←threadIdx.x&31;

4.wgSize←32×h;wgid←threadIdx.x/(wgSize);

5.col←blockIdx.x×32+32×wgid+lane; //列索引分配

6.forcolton-1withcol+=k×32×gridDim.x

//第一個(gè)階段

7.bVAL←0;Aid←col+wid%h×n;

8.forxid=threadIdx.xtom-1withxid+=blockDim.x

// x-load步

9. xP[threadIdx.x]←x[xid];

10. __syncthreads();

11. //partial-reduction步

12. fori= wid%hto blockDim.x-1 withi+=h

13. bVAL←bVAL+A[Aid]×xP[i];

14. Aid←Aid+h×n;

15. end

16. __syncthreads();

17. end

18.bP[tid]←bVAL;

19. __syncthreads();

//第二個(gè)階段

20. if wid%h==0

21. for bPid=tid to tid+32×h-1 with bPid+=32

22. bVAL←bVAL+bP[bPid];

23. end

24.b[col]←bVAL;

25. end

26. end

GEMV-T內(nèi)核的主要過(guò)程也包括兩個(gè)階段,第一個(gè)階段有兩個(gè)步驟:x-load步和partial-reduction步.其中,x-load步跟GEMV內(nèi)核執(zhí)行一樣的功能.在partial-reduction步中,由于使用以0開始索引的按行存儲(chǔ)方法存儲(chǔ)矩陣,因此如果線程組(k個(gè)線程組成一個(gè)線程組)的組織不合理,對(duì)于全局內(nèi)存上的矩陣A的訪問(wèn)將是不合并的.

因此,為確保訪問(wèn)是合并的,線程組的創(chuàng)建根據(jù)如下:

定義1 假設(shè)線程塊大小是s,h個(gè)線程一起被分配給ATx中的一個(gè)內(nèi)積,而且z=s/h.那么,線程組組織如下:{0,z,…,(h-1)×z},{1,z+1,…,(h-1)×z+1},…,{z-1,2×z-1,…,2×(h-1)×z-1}.

對(duì)于已經(jīng)完成加載的x片段,同一個(gè)線程組內(nèi)所有線程并行地執(zhí)行歸約操作,與GEMV核相似.由于同一個(gè)線程組內(nèi)線程經(jīng)常不屬于同一個(gè)warp,所以不能使用洗牌指令實(shí)現(xiàn)warp內(nèi)歸約操作.因此,在第二階段,將partial-reduction步結(jié)果保存在共享內(nèi)存上,然后再進(jìn)行歸約,并將歸約結(jié)果輸出.

3.2 并行的FISTA和ALM

在FISTA中,完成每次迭代需要6個(gè)操作,如圖1所示.為了減少對(duì)應(yīng)的內(nèi)核數(shù)目,節(jié)約內(nèi)核調(diào)用開銷,避免雙倍數(shù)據(jù)加載,這里對(duì)這些內(nèi)核進(jìn)行了融合.如圖1所示,內(nèi)核1融合了GEMV和矢量操作1;內(nèi)核3融合了余下的矢量操作.進(jìn)而,通過(guò)融合技術(shù),核總數(shù)從6個(gè)降到3個(gè).對(duì)于圖1中的內(nèi)核,基于GEMV核和GEMV-T核的思想,很容易實(shí)現(xiàn)內(nèi)核1和內(nèi)核2.CUBLAS雖然有著矢量運(yùn)算的高效實(shí)現(xiàn),但無(wú)法實(shí)現(xiàn)多核合并.因此,這里采用文獻(xiàn)[15]的方法,通過(guò)多核融合,實(shí)現(xiàn)了內(nèi)核3.

在ALM中,其x最小化可以通過(guò)FISTA求解,因此只需設(shè)計(jì)新的核函數(shù)實(shí)現(xiàn)dual update操作λk+1=λk+ρk(Axk+1-b).顯而易見,基于GEMV核的思想,很容易并行實(shí)現(xiàn)這個(gè)dualupdate操作.這里分別稱并行的FISTA和ALM為GFISTA和GALM.

圖1 內(nèi)核融合Fig.1 Kernel fusion

3.3 優(yōu) 化

隨著l1最小化算法的不斷迭代,軟閾值操作使得矢量x變得越來(lái)越稀疏.因此對(duì)于Ax,當(dāng)輸出向量x的第i個(gè)元素為0,那么A的第i行就不需要被訪問(wèn)了.利用這個(gè)稀疏性可減少對(duì)于全局內(nèi)存上矩陣A的訪問(wèn)次數(shù).

4 實(shí) 驗(yàn)

這一節(jié)測(cè)試所提出來(lái)的GEMV核、GEMV-T核、GFISTA和GALM的有效性.實(shí)驗(yàn)環(huán)境如下:一臺(tái)IntelXeon雙核CPU配一個(gè)NVIDIAGTX980顯卡,使用CUDA7.5的編譯運(yùn)行環(huán)境.所有測(cè)試使用同一個(gè)測(cè)試矩陣集,如表1所示,這些矩陣按照正態(tài)分布隨機(jī)生成.

表1 測(cè)試矩陣

首先,使用上述測(cè)試矩陣與CUBLAS庫(kù)進(jìn)行比較,來(lái)驗(yàn)證所提出的GEMV核和GEMV-T核的有效性和魯棒性.圖2,3分別顯示了兩個(gè)并行稠密矩陣矢量乘內(nèi)核與CUBLAS的性能比較.從圖2可見:GEMV核相比CUBLAS,對(duì)于不同規(guī)模的矩陣,始終能夠維持較高的性能,具有更佳的性能及穩(wěn)定性.類似于GEMV核,GEMV-T核相比CUBLAS有著相似的結(jié)論.

圖2 GEMV核與CUBLAS的性能比較Fig.2 Performance comparison of GEMV and CUBLAS

圖3 GEMV-T核與CUBLAS的性能比較Fig.3 Performance comparison of GEMV-T and CUBLAS

其次,測(cè)試GFISTA和GALM的性能.為每一個(gè)測(cè)試用例,初始x0總是含有1 024個(gè)非零元素且b=Ax0.對(duì)于GFISTA,50次迭代后終止;對(duì)于GALM,10次外迭代后終止,并且每一次外迭代,內(nèi)迭代都執(zhí)行50次.表2列出了所有算法的執(zhí)行時(shí)間,時(shí)間單位是秒.其中CFISTA和CALM分別是對(duì)應(yīng)GFISTA和GALM在CPU上實(shí)現(xiàn)的串行FISTA和ALM算法.從表2可以看出:對(duì)所有用例,相比CFISTA,GFISTA能夠獲得范圍從37.68到53.66倍的加速比,平均加速比是48.22.相比CALM,GALM獲得的最大、最小和平均加速比分別為51.21,35.98,44.0.這些結(jié)果顯示2個(gè)并行算法的性能提升是顯著的.

表2 GFISTA和GALM的性能

5 結(jié) 論

提出了兩個(gè)新穎的GPU并行的矩陣矢量乘,進(jìn)而基于這兩個(gè)并行的矩陣矢量乘算法,利用內(nèi)核融合技術(shù)和新的GPU特性,實(shí)現(xiàn)了兩個(gè)高度并行的l1最小化算法(GFISTA和GALM),并利用解的稀疏性進(jìn)一步優(yōu)化了性能.實(shí)驗(yàn)結(jié)果表明:提出的方法是有效的和魯棒的,具有較高的并行性.

[1] DONOHO D L, ELAD M. On the stability of the basis pursuit in the presence of noise[J]. Signal processing,2006,86(3):511-532.

[2] TROPP J A. Just relax: convex programming methods for identifying sparse signals in noise[J]. IEEE transactions on information theory,2006,52(3):1030-1051.

[3] ELHAMIFAR E,VIDAL R. Sparse subspace clustering: algo-

rithm, theory, and applications[J]. IEEE transactions on software engineering,2013,35(11):2765-2781.

[4] WRIGHT J, MA Y, MAIRAL J, et al. Sparse representation for computer vision and pattern recognition[J]. Proceedings of the IEEE,2010,98(6):1031-1044.

[5] FIGUEIREDO M A T, NOWAK R D, WRIGHT S J. Gradient projection for sparse reconstruction: application to compressed sensing and other inverse problems[J]. IEEE journal of selected topics in signal processing,2007,1(4):586-597.

[6] KIM S J, KOH K, LUSTIG M, et al. An interior-point method for large-scalel1-regularized least squares[J]. IEEE journal of selected topics in signal processing,2007,1(4):606-617.

[7] DONOHO D L, TSAIG Y. Fast solution of-norm minimization problems when the solution may be sparse[J]. IEEE transactions on information theory,2008,54(11):4789-4812.

[8] BECK A, TEBOULLE M. A fast iterative shrinkage-thresholding algorithm for linear inverse problems[J]. Siam journal on imaging sciences,2009,2(1):183-202.

[9] YANG A Y, ZHOU Z H, Ganesh A, et al. Fastl1-minimization algorithms for robust face recognition[J]. IEEE transactions on image processing,2013,22(8):3234-3246.

[10] NVIDIA Corporation. CUDA C Programming guide[EB/OL].[2015-12-05].http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html.

[11] 范菁,吳佳敏.帶顯著性區(qū)域約束的高效視頻全景拼接方法[J].浙江工業(yè)大學(xué)學(xué)報(bào),2015,43(5):479-486.

[12] 丁維龍,陳淑嬌,吳福理.一種基于物理特性的雨滴飛濺模擬算法[J].浙江工業(yè)大學(xué)學(xué)報(bào),2014,42(5):586-590.

[13] NVIDIA Corporation. CUBLAS library[EB/OL].[2015-12-05]. http://docs.nvidia.com/cuda/cublas/index.html.

[14] NAGESH P, GOWDA R, LI B. Fast GPU implementation of large scale dictionary and sparse representation based vision problems[C]//Acoustics Speech and Signal Processing. Dallas: IEEE International Conference,2010:1570-1573.

[15] GAO J Q, LIANG R H, WANG J. Research on the conjugate gradient algorithm with a modified incomplete Cholesky preconditioner on GPU[J]. Journal of parallel and distributed computing,2014,74(2):2088-2098.

(責(zé)任編輯:陳石平)

Highly parallell1-minimization algorithms on GPU

GAO Jiaquan, LI Zejie

(College of Computer Science and Technology, Zhejiang University of Technology, Hangzhou 310023, China)

Thel1-minimization (l1-min) algorithms for solving thel1-min problem have been widely developed. For most ofl1-min algorithms, their components are the dense matrix-vector multiplications such as Ax and ATx, and vector operations. Utilizing the new features of the GPU, two novel matrix-vector multiplications are proposed. The two algorithms access the global memory in a fully coalesced manner, and enhance their robustness by designing a self-adaptive thread (warp) allocation strategy. Besides, based on the two algorithms, two highly parallell1-min algorithms (FISTA and ALM) are presented on the GPU. The experimental results show that the methods proposed are high efficent and have good performance.

l1-minimization; GPU; matrix-vector multiplication; FISTA; ALM

2015-12-17

國(guó)家自然科學(xué)基金資助項(xiàng)目(61379017)

高家全(1972—),男,河南固始人,副教授,博士,研究方向?yàn)楦咝阅苡?jì)算、大數(shù)據(jù)分析與可視化、智能算法及應(yīng)用,E-mail:gaojq@zjut.edu.cn.

TP338.6

A

1006-4303(2016)05-0495-06

主站蜘蛛池模板: 久久精品嫩草研究院| 中文字幕人成人乱码亚洲电影| 国产欧美日韩综合在线第一| 黄色网页在线播放| 自拍亚洲欧美精品| 91精选国产大片| 日本一区二区三区精品视频| 1024国产在线| 精品免费在线视频| 国产区人妖精品人妖精品视频| 国产福利免费视频| 亚洲人成网18禁| 在线无码av一区二区三区| 91精品国产综合久久不国产大片| 国产伦片中文免费观看| 国产午夜福利在线小视频| 91人人妻人人做人人爽男同| 朝桐光一区二区| 99re精彩视频| 波多野结衣第一页| 久久网综合| 无码高潮喷水专区久久| 亚洲精品欧美日本中文字幕 | 久热这里只有精品6| 日本黄色不卡视频| 欧美成人免费一区在线播放| 亚洲第一区在线| 国产福利一区视频| 亚洲欧美日韩天堂| 国产又粗又猛又爽| 国产精品开放后亚洲| 一本大道香蕉久中文在线播放 | AV不卡在线永久免费观看| 久久无码免费束人妻| 欧美一区福利| 欧美亚洲欧美| 2021最新国产精品网站| 在线观看视频一区二区| 91视频99| 伊人成人在线视频| 久久香蕉国产线看观看精品蕉| 免费国产黄线在线观看| 欧美a网站| 综合色区亚洲熟妇在线| 亚洲精品亚洲人成在线| 国产xx在线观看| 免费全部高H视频无码无遮掩| 亚洲视频三级| 久久亚洲精少妇毛片午夜无码| 高清视频一区| 久久不卡国产精品无码| 欧美国产视频| 国产精品第一区| 亚洲人成色在线观看| 久久99国产综合精品女同| 国产综合网站| 国产成人夜色91| 超碰精品无码一区二区| 久久久久亚洲Av片无码观看| 久久人搡人人玩人妻精品| 国产精品自在线天天看片| 国产成人精品日本亚洲77美色| 高清免费毛片| 亚洲综合第一页| 91成人精品视频| 国产人人射| av在线5g无码天天| 欧美国产精品不卡在线观看| 精品国产99久久| 国产一级裸网站| 免费一级大毛片a一观看不卡| 久草网视频在线| 久久久91人妻无码精品蜜桃HD| 午夜免费视频网站| 欧美啪啪视频免码| 欧美精品不卡| 欧美日韩资源| 日本不卡免费高清视频| 全午夜免费一级毛片| 国产美女在线免费观看| 2024av在线无码中文最新| 亚洲第一极品精品无码|