青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 43,  comments - 64,  trackbacks - 0
小談 CPU 緩存體系

  現(xiàn)在的 CPU 依舊采用馮諾伊曼體系,喜歡像傻子一樣從頭執(zhí)行到尾,中途沒有任何的跳轉(zhuǎn)停頓等待。可是現(xiàn)實情況是,大部分程序里面還是少不了 IF ELSE 之類的判斷,循環(huán)就更加得多了。如何優(yōu)化循環(huán)大家可以自己琢磨,其實不難,可以參考一下《高質(zhì)量 C\C++ 編程指南》

  現(xiàn)在 CPU 上都有 Level 1 指令緩存(又叫做 L1 Trace )與 Level 1 數(shù)據(jù)緩存( L1 Data Cache )。 PMMX P2 P3 為二者都準備了 16kb ,我的 P4 Northwood (以下簡稱 P4NW )有 8kbL1 數(shù)據(jù)緩存和 12kb 指令緩存。 CPU 讀取 L1 Data Cache 中的數(shù)據(jù)只需要 1 個時鐘周期,速度非常快,應該是僅次于寄存器了。數(shù)據(jù)緩存是由 256 或者 512 32bytes 組成的,也就是 32bytes 對齊的,而 P4NW 64bytes 字節(jié)對齊的,并行 4 路,總共 128 行。當你處理的數(shù)據(jù)沒有載入緩存的時候, CPU 將從內(nèi)存讀取緩存行大小的數(shù)據(jù),所以緩存行總是對齊到能被 32 整除的物理地址。 CPU L1 數(shù)據(jù)緩存中的數(shù)據(jù)進行操作是最快速的。所以推薦內(nèi)存地址最起碼是 32byte 對齊的。目前編譯器在這個地方的優(yōu)化已經(jīng)非常好了,一般都是 4byte 對齊,當然也都是 32 對齊的。在后面你將會看到, SSE2 要求數(shù)據(jù)是 16 字節(jié)對齊的。

?   緩存類似一個 C++ set 容器,但是不能賦值到一個任意的內(nèi)存地址。每行本身都有 1 7bit 大小的關(guān)聯(lián)值( set value )要和目標內(nèi)存地址的 5 11 位對應( 0-4 位已經(jīng)忽略了),也可以理解為,關(guān)聯(lián)值是內(nèi)存段地址的一部分。 PPro 中,有 128 個關(guān)聯(lián)值對應到 2 行,所以最多可以為任意的內(nèi)存單元準備 2 個緩存行。 PMMX P2 P3 P4NW 4 個。由于內(nèi)存是分段的,所以說 CPU 只能為, 5-11 位地址相同的內(nèi)存準備 2 或者 4 個不同的緩存行。如何為兩個內(nèi)存地址賦予相同的關(guān)聯(lián)值呢?把 2 個地址的低 5bit 去掉,這樣就能被 32 整除了。如果這 2 個截斷了的地址都是 4096 1000H )的倍數(shù),那么這兩個地址就有了相同的關(guān)聯(lián)值。

?   讓我們用匯編加深一下印象,假設 ESI 中是 32 對齊的地址。

? ??????????????????????????????????????? AGAIN:? MOV? EAX,? [ESI]

MOV? EBX,? [ESI+13*4096+4]

MOV ?ECX,? [ESI+20*4096+28]

DEC? ?EDX

JNZ ??AGAIN

   Oh Year ,這里 3 個地址都有相同的關(guān)聯(lián)值,而且地址跨度都超過了數(shù)據(jù)緩存的大小,可這個循環(huán)在 PPro 上效率會相當?shù)汀.斈阆胱x取 ECX 的值的時候,將沒有空閑的緩存行了 —— 因為共享一個關(guān)聯(lián)值,而且 2 行已經(jīng)被使用了。此時 CPU 將騰出最近使用的 2 個緩存行,一個已經(jīng)被 EAX 使用。然后 CPU 把這個緩存行用 [ESI+20*4096] [ESI+20*4096+31] 的內(nèi)存數(shù)據(jù)填充,然后從緩存中讀取 ECX 。聽起來好象相當?shù)臒┈崱8釉愀獾氖牵斢中枰x取 EAX 的時候,還需要重復上述的過程,需要對內(nèi)存緩存來回操作,效率相當?shù)牡停踔敛蝗绮挥镁彺妗?墒牵绻覀儼训谌懈某桑?/span>

MOV? ECX,? [ESI+20*4096+32]

  哦,不好,看起來,我們的地址超過了 32 ,不能被整除了。可是這樣有了不同的關(guān)聯(lián)值,也就意味著有了 1 個新行,不再共享可憐的 2 個行。這樣一來,對三個寄存器的操作就不需要反復的用 2 個緩存行進行調(diào)度了,各有一個了。嘿嘿,這次只需要 3 個時鐘周期了,而上一個要 60 個周期。這是在 PPro 上的,在后來的 CPU 中都是 4 路的,也就不存在上面的問題了。搞笑的是, Intel 的文檔卻錯誤的說 P2 的緩存是 2 路的。雖然說很少人在用那么古老的 CPU ,可是其中的道理大家應該明白。

  可是判斷要訪問的部分數(shù)據(jù)是否有相同的關(guān)聯(lián)值,也就是關(guān)于緩存是否能夠命中的問題,是相當困難的,匯編還好,用高等級語言編譯過的程序鬼知道是否對緩存做過優(yōu)化呢。所以么,推薦,在程序的核心部分,對性能要求最高的部分,先對齊數(shù)據(jù),然后確保使用的單個數(shù)據(jù)塊不要超過緩存大小, 2 個數(shù)據(jù)塊,單個不要超過緩存大小的一半(仔細想想為什么,因為關(guān)聯(lián)值的問題,可以緩存分為兩部分處理兩塊)。可是大部分情況下,我們都是使用遠比數(shù)據(jù)緩存大的多的結(jié)構(gòu),以及編譯器自己返回的指針,然后為了優(yōu)化你可能希望把所有頻繁使用的變量放到一個連續(xù)的數(shù)據(jù)塊中以充分利用緩存。我們可以這樣做,把靜態(tài)變量數(shù)值拷貝到棧中的局部變量中,等子函數(shù)或者循環(huán)結(jié)束后再拷貝回來。這樣一來就相當于把靜態(tài)變量放入了連續(xù)的地址空間中去。

當讀取的數(shù)據(jù)不在 L1 Cache 內(nèi)時, CPU 將要從 L2 Cache 讀取 L1 緩存行大小的數(shù)據(jù)到 L1 里去,大概需要 200ns 的時間(也就是 100Mhz 系統(tǒng)的 20 個時鐘周期),但是直到你能夠使用這些數(shù)據(jù)前,又需要有 50-100ns 的延遲。最糟糕的是,如果數(shù)據(jù)也不在 L2 Cache 中,那么就只能從最慢速的內(nèi)存里讀取了,內(nèi)存的龜速哪能和全速的緩存相比。

好了,關(guān)于緩存的知識可以就此打住了,下面開始講如何優(yōu)化緩存。無非就是 3 種方法,硬件預取( Prefetch )、軟件預取、使用緩存指令。關(guān)于預取的注意事項主要有這些:

<!--[if !supportLists]--> 1、? <!--[endif]--> 合理安排內(nèi)存的數(shù)據(jù),使用塊結(jié)構(gòu),提高緩存命中率。

<!--[if !supportLists]--> 2、? <!--[endif]--> 使用編譯器提供的預取指令。比如ICC中的_mm_prefetch _mm_stream,甚至_mm_load等比較“傳統(tǒng)”的指令。

<!--[if !supportLists]--> 3、? <!--[endif]--> 盡可能少的使用全局的變量或者指針。

<!--[if !supportLists]--> 4、? <!--[endif]--> 程序盡可能少的進行判斷跳轉(zhuǎn)循環(huán)。

<!--[if !supportLists]--> 5、? <!--[endif]--> 使用const標記,不要在代碼中混合register聲明。

不過要提醒一句,真正提高程序效率的方法不是那種,從頭到尾由于外科手術(shù)般的解剖,一個一個地方的優(yōu)化,請抓住程序最核心的部分進行優(yōu)化,記住 80-20 規(guī)則。

?

使用 SIMD

先復習一下對齊指令, __declspec(aliagn(#)) # 替換為字節(jié)數(shù)。比如想聲明一個 16 字結(jié)對齊的浮點數(shù)組, __declspec(aliagn(16)) float Array[128] 。需要注意的是,最好充分了解你 CPU 的類型,支持哪些指令集。 SIMD 主要使用在需要同時操作大量數(shù)據(jù)的工作領(lǐng)域,比如 3D 圖形處理(游戲),物理建模( CAD ),加密,以及科學計算領(lǐng)域。據(jù)我所知,目前 GPGPU 也是使用 SIMD 的代表之一。

MMX

主要特性: 57 條指令, 64bit FP 寄存器 MM0-MM7 ,對齊到 8 80bit FP 寄存器 ST0-ST7 。需要數(shù)據(jù) 8 字節(jié)對齊,也就是使用 Packed 數(shù)字。

PS :這里冒出了一個問題,為什么 Intel 要把 MMX 的寄存器和 FPU 的寄存器混合起來使用呢?因為這里牽涉到一個 FPU 狀態(tài)切換問題,后面會提到,當你在一段代碼中又要用到 MMX 指令又要用到傳統(tǒng)的 FPU 指令,那么需要保存 FPU 狀態(tài),或者退出 MMX 。可是這種操作對于 FPU 來說非常昂貴,而且對于多任務操作系統(tǒng)來說,近乎于不可能完成的任務 —— 同時有許多程序,有些需要 MMX ,有些不需要,而正確地進行調(diào)度會變得非常困難。所以 Intel 將保存狀態(tài)的工作完全交給了 CPU 自己,軟件人員無須作太多這方面的工作,這樣一來,就向前向后兼容了多任務操作系統(tǒng),比如 Windows Linux 。后來隨著操作系統(tǒng)和 CPU 的不斷升級,操作系統(tǒng)開發(fā)人員發(fā)布了一個補丁包,就可以讓操作系統(tǒng)使用新的寄存器。這時人們都發(fā)現(xiàn) Intel 的這種做法是相當短視的,這可以當作一個重大的失誤。后來 Intel 通過引入了新的浮點指令集,這時才加入 XMM 寄存器。可造成這段故事的原因卻根本不是技術(shù)問題,保證兼容性也是一個方面,總之真的說不清楚。你只要記得無法同時使用 MMX FPU 就可以了, CPU 要進行模式切換。

SSE1

主要特性: 128bit FP 寄存器 XMM0-XMM7 。增加了數(shù)據(jù)預取指令。額外的 64bit 整數(shù)支持。支持同時處理 4 個單精度浮點數(shù),也就是 C\C++ 里的 float

適用范圍:多媒體信號處理

SSE2

主要特性: 128bit FP 寄存器支持處理同時處理 2 個雙精度 double 浮點數(shù),以及 16byte 8word 4dword 2quadword 整數(shù)。

適用范圍: 3D 處理 語音識別 視頻編碼解碼

SSE3

主要特性:增加支持非對稱 asymmetric 和水平 horizontal 計算的 SIMD 指令。為 SIMD 提供了一條特殊的寄存器 load 指令。線程同步指令。

適用范圍:科學計算 多線程程序

手頭工具

1 、選擇一個合適的編譯器,推薦用 Intel C++ Compiler (以下簡稱 ICC ),以及 Visual Studio .NET 2003 及以上 IDE 附帶的 C++ 編譯器。同時, Microsoft C++ Compiler 也支持 AMD 3DNow GCC C++ Compiler 沒有測試。

2 Intel 以及 AMD 的匯編指令集手冊。這個是必需的,強烈建議每個C++ Coder人手準備一份。

? 所有的都用 C++ 混合變成的方式實現(xiàn)

使用范例:

向量乘法在 3D 處理中非常非常多,多半用于計算單位矢量的夾角。

我們先定義一個頂點結(jié)構(gòu)。

__declspec(align( 16 ))? struct ?Vertex{
????
float ?x,y,z,w;
};
??? 16字節(jié)對齊的結(jié)構(gòu),其實本身也是16字節(jié)的東西。如果沒有對齊,運行時會報錯。

w是其次坐標系的參數(shù),處理向量的時候不需要用到。我的函數(shù)是這樣的:

float?Dot(Vertex*?v1,Vertex*?v2)
{
????Vertex?tmp;
????__asm{
????????MOV?EAX,[v1];
????????MOVAPS?XMM0,[EAX];
????????MOV?EAX,[v2];
????????MOVAPS?XMM1,[EAX];
????????MULPS?XMM0,XMM1;
????????MOVAPS?tmp,XMM0;
????};
????
return?tmp.x?+?tmp.y?+?tmp.z;
};

??? VC中反匯編之:
?1?float?Dot(Vertex*?v1,Vertex*?v2)
?2?{
?3?0041C690??push????????ebx??
?4?0041C691??mov?????????ebx,esp?
?5?0041C693??sub?????????esp,8?
?6?0041C696??and?????????esp,0FFFFFFF0h?
?7?0041C699??add?????????esp,4?
?8?0041C69C??push????????ebp??
?9?0041C69D??mov?????????ebp,dword?ptr?[ebx+4]?
10?0041C6A0??mov?????????dword?ptr?[esp+4],ebp?
11?0041C6A4??mov?????????ebp,esp?
12?0041C6A6??sub?????????esp,0E8h?
13?0041C6AC??push????????esi??
14?0041C6AD??push????????edi??
15?0041C6AE??lea?????????edi,[ebp-0E8h]?
16?0041C6B4??mov?????????ecx,3Ah?
17?0041C6B9??mov?????????eax,0CCCCCCCCh?
18?0041C6BE??rep?stos????dword?ptr?[edi]?
19?????Vertex?tmp;
20?????__asm{
21?????????MOV?EAX,[v1];
22?0041C6C0??mov?????????eax,dword?ptr?[v1]?
23?????????MOVAPS?XMM0,[EAX];
24?0041C6C3??movaps??????xmm0,xmmword?ptr?[eax]?
25?????????MOV?EAX,[v2];
26?0041C6C6??mov?????????eax,dword?ptr?[v2]?
27?????????MOVAPS?XMM1,[EAX];
28?0041C6C9??movaps??????xmm1,xmmword?ptr?[eax]?
29?????????MULPS?XMM0,XMM1;
30?0041C6CC??mulps???????xmm0,xmm1?
31?????????MOVAPS?tmp,XMM0;
32?0041C6CF??movaps??????xmmword?ptr?[tmp],xmm0?
33?????};
34?????return?tmp.x?+?tmp.y?+?tmp.z;
35?0041C6D3??fld?????????dword?ptr?[tmp]?
36?0041C6D6??fadd????????dword?ptr?[ebp-1Ch]?
37?0041C6D9??fadd????????dword?ptr?[ebp-18h]?
38?};
??? 前面都是保護現(xiàn)場入Stack的代碼,沒有必要管。我之所以這樣,在Stack中聲明了一個零時變量返回之,是為了減少代碼的行數(shù)。有興趣地可以參考本文后面引用資料中的Intel范例,代碼多的多,功能卻一樣。這樣就可以利用SIMD計算點乘了。圖示:
??? 這種頂點格式稱為AoS(Array of structure),這種結(jié)構(gòu)的好處是,能夠和現(xiàn)有的程序結(jié)構(gòu),比如D3D中的FVF頂點格式,和GL中的頂點格式。但是,由于許多情況下,并沒有使用第四各浮點數(shù),這就讓SIMD指令浪費了25%的性能。于是有了SoA格式,讓我們重新來過。
??? 我借用了一下上面一個結(jié)構(gòu)的指令,還是沒有用_mm_128格式,讓大家看得清楚一些:
__declspec(align(16))?struct?Vertex_soa{
?????
float?x[4],y[4],z[4],w[4];
};
??? 依舊16字節(jié)對齊。計算函數(shù)如下:
?1?void?Dot(Vertex_soa*?v1,Vertex*?v2,float*?result)
?2?{
?3?????Vertex?tmp1,tmp2;
?4?????__asm{
?5?????????MOV?ECX,v1;
?6?????????MOV?EDX,v2;
?7?
?8?????????MOVAPS?XMM7,[ECX];
?9?????????MOVAPS?XMM6,[ECX+16];
10?????????MOVAPS?XMM5,[ECX+32];
11?????????MOVAPS?XMM4,[ECX+48];
12?????????MOVAPS?XMM0,XMM7;
13?????????UNPCKLPS?XMM7,XMM6;
14?????????MOVLPS?[EDX],XMM7;
15?????????MOVHPS?[EDX+16],XMM7;
16?????????UNPCKHPS?XMM0,XMM6;
17?????????MOVLPS?[EDX+32],XMM0;
18?????????MOVHPS?[EDX+48],XMM0;
19?
20?????????MOVAPS?XMM0,XMM5;
21?????????UNPCKLPS?XMM5,XMM4;
22?????????UNPCKHPS?XMM0,XMM4;
23?????????MOVLPS?[EDX+8],XMM5;
24?????????MOVHPS?[EDX+24],XMM5;
25?????????MOVLPS?[EDX+40],XMM0;
26?????????MOVHPS?[EDX+56],XMM0;
27?
28?????????MOVAPS?XMM3,[EDX];
29?????????MOVAPS?XMM2,[EDX+16];
30?????????MOVAPS?XMM1,[EDX+32];
31?????????MOVAPS?XMM0,[EDX+48];
32?
33?????????MULPS?XMM3,XMM2;
34?????????MULPS?XMM1,XMM0;
35?????????MOVAPS?tmp2,XMM1;
36?????????MOVAPS?tmp1,XMM3;
37?????};
38?????result[0]?=?tmp1.x?+?tmp1.y?+?tmp1.z;
39?????result[1]?=?tmp2.x?+?tmp2.y?+?tmp2.z;
40?};
??? Oh Yeah,就是這樣了,同時計算了1對乘法。我在代碼中借用了一下前面的頂點結(jié)構(gòu),這樣方便一些。至于SOA格式,請看前面的聲明。很多代碼都是轉(zhuǎn)換Stack中的內(nèi)存格式,轉(zhuǎn)換成AOS格式,這樣才能使用SIMD指令計算。

??? 通過上面的演示,想必大家已經(jīng)對SIMD有了個直觀地認識,其實在自己的代碼中加入這些是非常方便與容易的。雖然說現(xiàn)在的CPU性能已經(jīng)提高了許多,性能也強了許多,可是在諸多對性能要求高的地方,還是非常烤煙程序員的水平的。

??? 歡迎大家拍磚!
posted on 2006-08-24 15:37 周波 閱讀(3519) 評論(2)  編輯 收藏 引用 所屬分類: 無庸技術(shù)

FeedBack:
# re: 用SIMD指令優(yōu)化程序之拋磚引玉
2006-10-20 09:53 | guest
A spelling problem: Next time, say "Oh Yeah", not "Oh Year" :)  回復  更多評論
  
# re: 用SIMD指令優(yōu)化程序之拋磚引玉
2006-10-21 10:46 | 周波
@guest
:-) Thanks, I will check my spell more carefully next time ...  回復  更多評論
  
<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

周波 87年出生 南京林業(yè)大學05421班242信箱 專業(yè)木材科學與工程工業(yè)裝備與過程自動化 遷移到 jedimaster(dot)cnblogs(dot)com

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

新聞檔案

同學們Blog

搜索

  •  

積分與排名

  • 積分 - 55258
  • 排名 - 421

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美伦理91i| 久久久久久久久久看片| 欧美高清视频www夜色资源网| 亚洲福利在线观看| 亚洲国产婷婷香蕉久久久久久99| 久久久久综合一区二区三区| 亚洲国产精品久久久久久女王| 欧美大片一区二区三区| 美女尤物久久精品| 亚洲深爱激情| 午夜精品一区二区三区四区| 影音先锋久久| 亚洲欧洲精品成人久久奇米网| 欧美视频在线视频| 久久九九免费| 欧美国产精品一区| 欧美一级欧美一级在线播放| 久久青草欧美一区二区三区| 亚洲美女在线看| 亚洲欧美在线磁力| 亚洲精品国产精品久久清纯直播| 国产精品资源| 91久久国产综合久久91精品网站| 国产麻豆精品在线观看| 久久久99免费视频| 欧美gay视频激情| 欧美一级一区| 麻豆成人在线播放| 亚洲欧洲99久久| 欧美成人国产| 久久精品系列| 欧美午夜久久久| 欧美丰满少妇xxxbbb| 国产精品每日更新| 亚洲国产精品美女| 一区二区在线不卡| 亚洲免费一级电影| 9l国产精品久久久久麻豆| 久久激情一区| 欧美伊人影院| 欧美亚韩一区| 亚洲韩日在线| 亚洲激情第一区| 欧美在线观看视频| 午夜精品久久久久久99热软件| 欧美xx69| 欧美成人按摩| 18成人免费观看视频| 欧美一区二区在线免费观看| 亚洲一级二级| 欧美日韩一区在线观看视频| 亚洲国产成人av在线| 伊伊综合在线| 久久精品五月| 久久只精品国产| 国产欧美一区二区精品性 | 欧美性开放视频| 亚洲国产成人在线播放| 在线看欧美日韩| 久久青青草原一区二区| 老司机久久99久久精品播放免费| 国产欧美va欧美va香蕉在| 中文欧美字幕免费| 亚洲伊人第一页| 国产精品欧美在线| 亚洲免费一区二区| 久久精品国产69国产精品亚洲| 国产精品一区在线观看你懂的| 亚洲一本视频| 久久av老司机精品网站导航| 国产欧美日韩视频| 午夜精品在线| 麻豆精品一区二区综合av| 激情欧美日韩一区| 欧美77777| 亚洲另类视频| 午夜精品婷婷| 一区国产精品| 欧美国产精品日韩| 亚洲视频在线播放| 久久青青草综合| 91久久午夜| 欧美亚洲成人网| 亚洲女优在线| 久久综合色婷婷| 日韩午夜电影av| 国产伦精品一区二区三区照片91 | 欧美日韩国产麻豆| 99热这里只有精品8| 亚洲欧美日韩另类精品一区二区三区| 国产精品久久久久久久久动漫 | 狂野欧美性猛交xxxx巴西| 亚洲国产精品久久久久久女王| 欧美激情一二三区| 亚洲免费一级电影| 亚洲成色777777在线观看影院| 亚洲乱码国产乱码精品精| 国产精品视频999| 免费人成精品欧美精品| 一本高清dvd不卡在线观看| 欧美激情a∨在线视频播放| 国产欧美一区在线| 亚洲视频久久| 亚洲免费观看在线观看| 欧美激情无毛| 亚洲裸体在线观看| 亚洲免费观看高清完整版在线观看熊| 久久亚洲图片| 亚洲精品一区二区三| 欧美成人小视频| 欧美剧在线免费观看网站| 亚洲麻豆国产自偷在线| 在线视频亚洲欧美| 国产精品美女主播在线观看纯欲| 亚洲综合色丁香婷婷六月图片| 亚洲一区二区三区欧美| 亚洲国产mv| 欧美中文字幕久久| 久久九九久精品国产免费直播| 亚洲精品久久久一区二区三区| 亚洲高清二区| 国产精品视频一二三| 欧美另类一区二区三区| 久久精品国产第一区二区三区最新章节| 一区二区精品在线| 亚洲高清在线精品| 欧美电影免费观看高清| 久久成人免费| 欧美专区18| 亚洲免费在线观看视频| 亚洲精品乱码久久久久久| 影音先锋成人资源站| 国产亚洲精品久久久久婷婷瑜伽| 国产精品成人在线观看| 欧美精品自拍| 欧美激情中文字幕一区二区| 久久综合成人精品亚洲另类欧美| 欧美一级专区| 欧美亚洲午夜视频在线观看| 亚洲一区中文| 亚洲自拍另类| 午夜在线精品偷拍| 午夜欧美大尺度福利影院在线看| 亚洲尤物精选| 欧美一区二区三区免费大片| 亚洲欧美综合国产精品一区| 91久久精品美女| 99精品黄色片免费大全| 91久久精品日日躁夜夜躁国产| 黄色成人免费观看| 在线观看成人小视频| 亚洲国产成人av在线| 亚洲国产日韩美| 亚洲免费观看| 亚洲视频视频在线| 亚洲欧美日韩综合| 久久精品国产一区二区电影| 久久久亚洲精品一区二区三区| 免费观看不卡av| 亚洲电影在线| 中国av一区| 欧美在线日韩| 欧美福利视频在线| 欧美日韩精选| 国产亚洲人成a一在线v站| 在线播放日韩专区| 亚洲美女精品成人在线视频| 亚洲一品av免费观看| 欧美在线91| 亚洲国产电影| 亚洲欧美一区二区原创| 久久久国产视频91| 欧美日韩不卡视频| 国产日韩精品在线播放| 136国产福利精品导航| 一本在线高清不卡dvd| 欧美一级久久久| 欧美国产91| 香蕉久久夜色精品国产| 玖玖综合伊人| 国产九九精品视频| 亚洲开发第一视频在线播放| 先锋影音国产一区| 亚洲韩国一区二区三区| 欧美一区二区三区在线观看| 欧美精品日韩三级| 激情综合网激情| 亚洲一二区在线| 亚洲国产精品悠悠久久琪琪 | 亚洲国产视频直播| 亚洲视频图片小说| 欧美福利小视频| 午夜精品国产更新| 欧美日本在线观看| 永久久久久久| 久久国产一区二区| 一区二区三区日韩欧美| 你懂的国产精品| 国内久久精品| 久久动漫亚洲|