91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

從CPU角度分析IPC產(chǎn)生的原因

Linux閱碼場 ? 來源:Linuxer ? 作者:Linuxer ? 2020-10-09 10:52 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

IPC的意義

一般來說IPC是越高越好, 這意味著單位時間執(zhí)行了更多的指令, 通過觀測IPC可以一定程度上了解軟件的執(zhí)行效率。 但是多高才算高呢? 這并沒有標(biāo)準(zhǔn)答案, 它需要有基線進行對比, 有的代碼邏輯就決定了不可能有太高的IPC, 比如存在大量的跳轉(zhuǎn)邏輯或者隨機訪問, 當(dāng)然這可能就是需要優(yōu)化的地方。

首先來看一個簡單的測試程序:

# cat s1.c void main() { unsigned long sum = 0, i = 0; for (i = 0; i 《 0x10000000; i += 1) { sum += i; } } $ gcc -O0 s1.c -o s1 $ perf stat 。/s1 2,145,851,708 cycles # 2.284 GHz (83.30%) 1,606,130,789 stalled-cycles-frontend # 74.85% frontend cycles idle (83.30%) 180,401,278 stalled-cycles-backend # 8.41% backend cycles idle (66.78%) 1,347,161,466 instructions # 0.63 insns per cycle

一種比較通用的優(yōu)化方法就是把for循環(huán)展開(unroll), 再來看看效果:

$ cat s2.c void main() { unsigned long sum = 0, a = 0, b = 0, c = 0, d = 0, i = 0; for (i = 0; i 《 0x10000000; i += 4) { a += i; b += i + 1; c += i + 2; d += i + 3; } sum = a + b + c + d; } $ perf stat 。/s2 632,338,513 cycles # 2.281 GHz (83.40%) 229,407,430 stalled-cycles-frontend # 36.28% frontend cycles idle (83.41%) 7,151,154 stalled-cycles-backend # 1.13% backend cycles idle (66.83%) 1,343,577,403 instructions # 2.12 insns per cycle

可以看到, 這個優(yōu)化效果非常好, IPC從0.63上升到了2.12, 同時CPU執(zhí)行cycles也相應(yīng)地從2,145,851,708下降到了632,338,513. 不過指令條數(shù)基本上沒有變化, 如果再看匯編代碼, 就會發(fā)現(xiàn)-O0編譯出來的代碼還有很多訪存, 那么我們現(xiàn)在稍微修改一下, 使用register來存放變量i:

$ cat s3.c void main() { unsigned long sum = 0, a = 0, b = 0, c = 0, d = 0; register unsigned long i = 0; for (i = 0; i 《 0x10000000; i += 4) { a += i; b += i + 1; c += i + 2; d += i + 3; } sum = a + b + c + d; } $ gcc -O0 s3.c -o s3 $ perf stat 。/s3 540,912,972 cycles # 2.284 GHz (83.12%) 270,437,339 stalled-cycles-frontend # 50.00% frontend cycles idle (83.48%) 5,344,535 stalled-cycles-backend # 0.99% backend cycles idle (67.08%) 1,074,783,046 instructions # 1.99 insns per cycle

這個優(yōu)化同樣有效, CPU執(zhí)行時間從632,338,513 cycles減少到540,912,972, 不過IPC卻從2.12減少到了1.99, 性能提升主要來源于指令條數(shù)的較少。 再進一步, 所有變量都使用register:

$ cat s4.c void main() { register unsigned long sum = 0, a = 0, b = 0, c = 0, d = 0; register unsigned long i = 0; for (i = 0; i 《 0x10000000; i += 4) { a += i; b += i + 1; c += i + 2; d += i + 3; } sum = a + b + c + d; } $ gcc -O0 s4.c -o s4 $ perf stat 。/s4 203,071,748 cycles # 2.284 GHz (83.14%) 68,298,093 stalled-cycles-frontend # 33.63% frontend cycles idle (83.15%) 1,056,363 stalled-cycles-backend # 0.52% backend cycles idle (67.05%) 598,151,024 instructions # 2.95 insns per cycle

這個優(yōu)化更加明顯, CPU執(zhí)行時間優(yōu)化了一大半, 這來源于指令條數(shù)大幅減少了40%, 同時IPC從1.99上升到了2.95. 到這里我們已經(jīng)拿到了一個相對滿意的結(jié)果, 是否還有優(yōu)化的空間我們可以一起思考。

那么IPC到底說明了什么? 它從某一個側(cè)面說明了CPU的執(zhí)行效率, 卻也不是全部。 想要提高應(yīng)用的效率, 注意不是CPU的效率, 簡單地說無非兩點:

沒必要的事情不做

必須做的事情做得更高效, 這個是IPC可以發(fā)揮的地方

指令并發(fā)

上面已經(jīng)看到, IPC是可以大于1的。 一般的理解是CPU通過pipeline提高了throughput, 但一條流水線每個cycle還是只能完成一條指令, 這種情況下IPC是《=1的。 那么是否可以推測出一個CPU上其實有多條流水線? 答案是肯定的。 不過多流水其實有不同的實現(xiàn)方法, 主要是VLIW (Very Long Instruction Word) 和SuperScalar, VLIW通過compiler在編譯時靜態(tài)完成多指令的調(diào)度, 而SuperScalar則是在運行時調(diào)度多指令。 目前稍微好點的CPU使用的都是SuperScalar, Intel的CPU也不例外。

具體的信息可以參考Instruction Level Parallelism

飛得更高

既然IPC可以接近3, 那么還能不能再高點? 我們看2個測試, alu.c 和 nop.c, 測試運行在Xeon E5-2682 v4 (Broadwell架構(gòu))。

$cat alu.c void main() { while(1) { __asm__ ( “movq $0x0,%rax ” “movq $0xa,%rbx ” “andq $0x12345678,%rbx ” “orq $0x12345678,%rbx ” “shlq $0x2,%rbx ” “addq %rbx,%rax ” “subq $0x14,%rax ” “movq %rax,%rcx”); } } $gcc alu.c -o alu $perf stat 。/alu 6,812,447,936 instructions # 3.84 insns per cycle $cat nop.c void main() { while(1) { __asm__ (“nop ” 。。. // 總共128個nop操作 “nop”); } } $gcc nop.c -o nop 8,577,428,850 instructions # 3.66 insns per cycle

通過這2個測試可以看到, IPC甚至可以接近4, 同時也產(chǎn)生了幾個疑問:

3.84應(yīng)該不是極限, 至少應(yīng)該是個整數(shù)吧?

alu比nop還高, 這似乎不符合常理?

alu中的很多指令有依賴關(guān)系, 怎么達到高并發(fā)的?

首先來看第一個問題, 為什么是3.84, 而不是4或者5呢? 這里面第一個需要關(guān)注的地方就是while(1), 相對于其他move/and/or/shl/sub指令, 它是一個branch指令。 CPU對branch的支持肯定會復(fù)雜一點, 碰到branch指令還會prefetch之后的指令嗎? 如果branch taken了那之前的prefetch不就沒用了? 另一個需要考慮的就是Broadwell的每個core里面只有4個ALU, 其中只有2個ALU能夠執(zhí)行跳轉(zhuǎn)指令, 并且每個cycle最多能夠dispatch 4個micro ops. 而alu.c中每個循環(huán)是8條指令, 加上跳轉(zhuǎn)指令本身有9條指令, 看起來不是最好的情況。 那么在循環(huán)中減少一條指令會怎么樣:

$sed /orq/d alu.c 》 alu8.c $gcc alu8.c -o alu8 $perf stat 。/alu8 10,276,581,049 instructions # 3.99 insns per cycle

可以看到IPC已經(jīng)達到3.99, 非常接近4了。 如果把每個循環(huán)的指令條數(shù)修改為12 (包括跳轉(zhuǎn)指令), 16, 20等都可以驗證IPC在3.99左右, 反之如果是13, 14就差一點。 唯一的例外來自于7, 它同樣能達到3.99 (原因?), 再減少到6又差點。

這里使用了一個userspace讀CPU PMU的工具likwid

$likwid-perfctr -g UOPS_ISSUED_CORE_STALL_CYCLES:PMC0,UOPS_ISSUED_CORE_TOTAL_CYCLES:PMC1,UOPS_EXECUTED_STALL_CYCLES:PMC2,UOPS_EXECUTED_TOTAL_CYCLES:PMC3 -t 1s -O -C 1 。/alu

根據(jù)上面的結(jié)果可見, stalled cycle并無明顯區(qū)別, 因為只有當(dāng)一個cycle中沒有issue/execute任何一條指令的時候才計算, 對于這個測試用例是很少發(fā)生的。 測試發(fā)現(xiàn)event IDQ_UOPS_NOT_DELIVERED 和IPC的變化表現(xiàn)出相關(guān)性。 Intel 64 and IA-32 Architectures Optimization Reference Manual, B.4.7.1 Understanding the Micro-op Delivery Rate

也就是說front end不能夠及時把指令發(fā)給RAT (Resource Allocation Table), 這個通過stalled-cycle-front end是不一定能看出的。 那么一個無條件jmp指令怎么就能影響到front end, 并且還跟每個循環(huán)的指令數(shù)相關(guān)? 按理說所有的micro ops都已經(jīng)在IDQ (Instruction Decode Queue)中, 并且LSD (Loop Stream Detector)應(yīng)該完全能夠cover住這幾條指令。 具體原因暫時還不清楚, 如果知道這個了, 也許就有了另外一個問題的答案, 為什么是3.84而不是3.75或者別的呢?

現(xiàn)在來看第二個問題, 為什么alu比nop的IPC還要高呢? 上面已經(jīng)分析過jmp指令的影響, 并且瓶頸點是在front end而不是在back end, nop和alu的指令并沒什么區(qū)別。 所以需要控制的是一個循環(huán)的指令數(shù), 把其修改為8, 則nop一樣可以達到3.99的IPC.

第三個問題, CPU是怎么處理數(shù)據(jù)依賴的。 首先需要明確的是, 產(chǎn)生了數(shù)據(jù)依賴肯定會給并發(fā)帶來影響, 后面的指令必須等待前面指令的結(jié)果。 這里關(guān)鍵的一點是雖然在一個循環(huán)里面沒有獨立的四條指令, 但這并不影響2個甚至多個循環(huán)的并發(fā)性。 也就是說, 即使有跳轉(zhuǎn)指令, 后續(xù)的指令依然可以亂序執(zhí)行。 但兩次循環(huán)之間不還是使用相同的寄存器從而產(chǎn)生依賴嗎? 是的, 如果它們最終使用的是相同的寄存器。 不過對于CPU來說, 匯編指令中的rax, rbx等不過是邏輯寄存器, 運行時還要進行一次rename的過程, 這個過程把一些false dependency給解決掉。 比如wiki上的例子。 而且CPU內(nèi)部物理寄存器的個數(shù)是遠遠大于可以rename的邏輯寄存器個數(shù)的, 一般來說足夠解決在流水線及亂序情況下的false dependency.

CPU架構(gòu)

再繼續(xù)探討IPC之前有必要先了解一下CPU的體系結(jié)構(gòu), 以Haswell (和Broadwell同一個架構(gòu), 更小的制程) 為例:

CPU是流水線工作的, 前半部分可以稱為front end, 功能主要包括取指, 譯碼等, 在這個圖中IDQ及其前面的部分就是front end. 譯碼其實是個很費時間的步驟, 因為x86是外表是CISC架構(gòu), 支持變長的指令, 內(nèi)部其實更像RISC架構(gòu), 所以需要把這些宏指令(也就是匯編指令)轉(zhuǎn)化為微指令(micro ops/uops)。 對于Broadwell, IDQ的最大帶寬是4 uops/cycle, Skylake的帶寬可以到6 uops/cycle. 關(guān)于譯碼的作用, 可以參考A JOURNEY IN MODERN COMPUTER ARCHITECTURES

back end自然指的就是IDQ后面的部分。 Broadwell (Skylake也一樣) 的scheduler最大輸入是4 uops/cycle. 考慮到有的指令比如nop, xor rax,rax等在rename階段就結(jié)束, 并且這類指令的IPC同樣只能到4 uops/cycle, 可以確定rename的帶寬只有4 uops/cycle, 那是不是剛好說明最大IPC是4呢?

執(zhí)行單元(port)總共有8個, 其中4個p0156能執(zhí)行ALU操作, 注意能執(zhí)行branch的只有2個p06. scheduler最多可以調(diào)度8 uops/cycle.

micro/macro fusion

如果沒有fusion, 可以認為4 uops/cycle就是IPC的最大值, 并且前面的測試代碼已經(jīng)做到了。

micro fusion. 因為CPU的執(zhí)行單元是類RISC, 所以一條instruction有可能需要拆成2條或者多條uops. 比如store, 就需要2條uops, 一個store address (上圖中STA), 一個store data (STD)。 micro fusion把這2條uops合并成一個uops, 雖然在執(zhí)行時又分成2個uops. 關(guān)于micro fusion的decoder的影響同樣可以參考Decoding x86: From P6 to Core 2 - Part 2. 利用好micro fusion能提升程序的效率, 但micro fusion不會提升最大IPC.

macro fusion. 如果相鄰的2條instruction符合某種條件, macro fusion會把它們合并成一個uops, 在執(zhí)行的時候也不會再拆成2個。 很顯然macro fusion是有可能提高max IPC的。 上面已經(jīng)了解到, 整個CPU執(zhí)行棧的瓶頸在rename階段只能處理4個uops, 既然一個uops可以包含2條指令, 不就可以處理更多的instruction了嗎? 答案是肯定的。 macro fusion的條件主要包括:

第一條指令是CMP, TEST, ADD, SUB, AND, INC, DEC

第二條指令是conditional branch

天空在哪

上面macro fusion的討論中已知1 uops可以包含2 instructions, 那是不是可以簡單計算得到max IPC = 4 * 2? 上面已經(jīng)說過, 8個port中只有2個是支持branch的, 而macro fusion中必須包含branch, 所以max IPC = 6. 還有一個問題是以后IPC還會不會漲, 為什么呢?

來自agner.org的一個例子:

#define ASM_TWO_MICRO_TWO_MACRO(in1, sum1, in2, sum2, max) __asm volatile (“1: ” “add (%[IN1]), %[SUM1] ” “cmp %[MAX], %[SUM1] ” “jae 2f ” “add (%[IN2]), %[SUM2] ” “cmp %[MAX], %[SUM2] ” “jb 1b ” “2:” : [SUM1] “+&r” (sum1), [SUM2] “+&r” (sum2) : [IN1] “r” (in1), [IN2] “r” (in2), [MAX] “r” (max)) +----------------------------+---------+--------------+| Event | Counter | Core 1 |+----------------------------+---------+--------------+| Runtime (RDTSC) [s] | TSC | 4.038255e-01 || UOPS_ISSUED_ANY | PMC0 | 4000147000 || UOPS_EXECUTED_CORE | PMC1 | 6000580000 || UOPS_RETIRED_ALL | PMC2 | 6000100000 || BR_INST_RETIRED_NEAR_TAKEN | PMC3 | 1000001000 || INSTR_RETIRED_ANY | FIXC0 | 6000005000 || CPU_CLK_UNHALTED_CORE | FIXC1 | 1003127000 || CPU_CLK_UNHALTED_REF | FIXC2 | 1003129000 |+----------------------------+---------+--------------+

性能調(diào)試

指令相關(guān)的性能調(diào)試大框架可以參考Intel優(yōu)化手冊的方法

本文目的

本文通過有意構(gòu)造出來的理想代碼, 從CPU角度分析IPC產(chǎn)生的原因。 雖然這些代碼在生產(chǎn)環(huán)境中出現(xiàn)的可能性很小, 但是通過分析這些極端情況, 不只了解了CPU的極限在哪, 分析過程本身也很有意義。 那么我們是不是可以去嘗試回答這些問題: 為什么超線程這么不給力? Xeon E5-2682相比E5-2630有哪些改進? CPU使用率都100%了還有提高空間嗎? IPC還會增長嗎?

責(zé)任編輯:YYX

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11077

    瀏覽量

    217034
  • IPC
    IPC
    +關(guān)注

    關(guān)注

    3

    文章

    366

    瀏覽量

    53165

原文標(biāo)題:IPC到底能有多高

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    永磁體磁角度偏差對電機性能影響的分析

    、諧波、齒槽轉(zhuǎn)矩的影響進行分析,對高精度、高功率密度電機的研究開發(fā)以及生產(chǎn)過程中保持產(chǎn)品質(zhì)量的一致性有一定積極意義。 點擊附件查看全文*附件:永磁體磁角度偏差對電機性能影響的分析.pdf
    發(fā)表于 03-25 15:37

    右側(cè)光纖切斷角度有誤的原因

    光纖切斷角度有誤的原因可能涉及多個方面,以下是一些常見的因素: 一、設(shè)備問題 刀片高度不當(dāng):光纖切割刀在使用時,如果刀片的高度設(shè)置過高,可能會導(dǎo)致切割角度過大。此時,需要調(diào)整刀架的高度,一般調(diào)整方法
    的頭像 發(fā)表于 12-05 10:43 ?607次閱讀

    時域和頻域兩個角度對信號進行分析

    一般來說,我們會時域和頻域兩個角度,分別對信號進行分析。 時域 時域是真實世界存在的域,按時間順序呈現(xiàn)。例如,在某個時鐘信號的時域圖中,可以觀察到兩個重要的參數(shù),波形的周期和上升沿: 時鐘周期即
    的頭像 發(fā)表于 11-19 10:18 ?3345次閱讀
    <b class='flag-5'>從</b>時域和頻域兩個<b class='flag-5'>角度</b>對信號進行<b class='flag-5'>分析</b>

    ipc系統(tǒng)的網(wǎng)絡(luò)帶寬需求分析

    IPC(Internet Protocol Camera)系統(tǒng)的網(wǎng)絡(luò)帶寬需求分析涉及多個因素,包括IPC的碼流大小、網(wǎng)絡(luò)架構(gòu)、監(jiān)控需求等。以下是對IPC系統(tǒng)網(wǎng)絡(luò)帶寬需求的
    的頭像 發(fā)表于 11-15 14:28 ?1128次閱讀

    靜電產(chǎn)生原因 如何消除靜電

    靜電產(chǎn)生原因 1. 摩擦起電 摩擦起電是最常見的靜電產(chǎn)生方式。當(dāng)兩種不同材料的物體相互摩擦?xí)r,由于它們的電子親和力不同,會導(dǎo)致電子從一個物體轉(zhuǎn)移到另一個物體,從而產(chǎn)生靜電。例如,當(dāng)你
    的頭像 發(fā)表于 11-05 10:15 ?4675次閱讀

    分析波峰焊時產(chǎn)生連錫(短路)的原因以及解決辦法

    隨著我國高科技產(chǎn)品的不斷發(fā)展,現(xiàn)在機械設(shè)備中的線路板工藝設(shè)計越來越復(fù)雜,引線腳之間的間距越來越密集,很容易導(dǎo)致焊接之后產(chǎn)生連錫現(xiàn)象,也就是短路。為此,我們應(yīng)該如何分析波峰焊連錫的原因以及找到相對
    的頭像 發(fā)表于 10-23 16:24 ?1758次閱讀
    <b class='flag-5'>分析</b>波峰焊時<b class='flag-5'>產(chǎn)生</b>連錫(短路)的<b class='flag-5'>原因</b>以及解決辦法

    MOS管泄漏電流的類型和產(chǎn)生原因

    MOS管(金屬氧化物半導(dǎo)體場效應(yīng)晶體管)的泄漏電流是指在MOS管關(guān)斷狀態(tài)下,源極或漏極到襯底之間仍然存在的微弱電流。這些泄漏電流可能對電路的性能和穩(wěn)定性產(chǎn)生不利影響,因此需要深入了解其類型和產(chǎn)生
    的頭像 發(fā)表于 10-10 15:11 ?4938次閱讀

    說明增強現(xiàn)實技術(shù)的產(chǎn)生原因

    增強現(xiàn)實技術(shù)(Augmented Reality, AR)的產(chǎn)生,主要源于人類對信息獲取和交互方式的不斷追求與探索,以及計算機技術(shù)、圖像處理、傳感器技術(shù)、網(wǎng)絡(luò)通信等多領(lǐng)域技術(shù)的快速發(fā)展。以下是增強現(xiàn)實技術(shù)產(chǎn)生的主要原因
    的頭像 發(fā)表于 09-15 14:44 ?1136次閱讀

    儀表溫度異常的產(chǎn)生原因

    電子發(fā)燒友網(wǎng)站提供《儀表溫度異常的產(chǎn)生原因.docx》資料免費下載
    發(fā)表于 09-12 14:09 ?0次下載

    將軟件8位(字節(jié))可尋址CPU遷移至C28x CPU

    電子發(fā)燒友網(wǎng)站提供《將軟件8位(字節(jié))可尋址CPU遷移至C28x CPU.pdf》資料免費下載
    發(fā)表于 09-06 10:42 ?0次下載
    將軟件<b class='flag-5'>從</b>8位(字節(jié))可尋址<b class='flag-5'>CPU</b>遷移至C28x <b class='flag-5'>CPU</b>

    簡述自激振蕩產(chǎn)生原因

    自激振蕩是指在沒有外部驅(qū)動信號的情況下,系統(tǒng)內(nèi)部由于某種機制自發(fā)產(chǎn)生的振蕩現(xiàn)象。這種現(xiàn)象在電子、機械、聲學(xué)等多個領(lǐng)域中廣泛存在,其產(chǎn)生原因復(fù)雜多樣。以下是對自激振蕩產(chǎn)生
    的頭像 發(fā)表于 09-03 10:59 ?1822次閱讀

    紋波電壓的產(chǎn)生原因及控制方法

    紋波電壓是電源系統(tǒng)中常見的一種現(xiàn)象,它是指電源輸出電壓在平均值附近波動的幅度。紋波電壓的大小直接影響到電源系統(tǒng)的穩(wěn)定性和可靠性,因此對紋波電壓的控制非常重要。 紋波電壓的產(chǎn)生原因 紋波電壓的產(chǎn)生
    的頭像 發(fā)表于 08-29 09:30 ?1946次閱讀

    簡述時鐘抖動的產(chǎn)生原因

    時鐘抖動(Clock Jitter)是時鐘信號領(lǐng)域中的一個重要概念,它指的是時鐘信號時間與理想事件時間的偏差。這種偏差不僅影響數(shù)字電路的時序性能,還可能對系統(tǒng)的穩(wěn)定性和可靠性造成不利影響。以下是對時鐘抖動工作原理的詳細闡述,內(nèi)容將圍繞其定義、類型、產(chǎn)生原因、影響及應(yīng)對措施
    的頭像 發(fā)表于 08-19 17:58 ?3858次閱讀

    交越失真產(chǎn)生原因和消除方法

    和運算放大器中。本文將介紹交越失真的產(chǎn)生原因、影響因素以及消除方法。 一、交越失真的產(chǎn)生原因 放大器的非線性特性 放大器的非線性特性是交越失真產(chǎn)生
    的頭像 發(fā)表于 08-01 15:07 ?7949次閱讀

    電路產(chǎn)生暫態(tài)過程的原因

    電源切換是電路產(chǎn)生暫態(tài)過程的常見原因之一。當(dāng)電路的電源突然接通或斷開時,電路中的電流和電壓會經(jīng)歷一個零到穩(wěn)態(tài)值的變化過程。這個過程通常伴隨著電壓和電流的突變,可能導(dǎo)致電路的損壞或性能下降。 電源切換引起的暫態(tài)
    的頭像 發(fā)表于 07-26 09:36 ?2017次閱讀
    主站蜘蛛池模板: 国产午夜毛片一区二区三区 | 婷婷色影院| 在线免费看 | 欧美肉到失禁高h视频在线 欧美三级成人 | 久久久精品免费热线观看 | 国产亚洲papapa | 久久天天躁狠狠躁夜夜呲 | 99色网站 | 四虎影视在线观看 | 激情久久久久久久久久久 | 中国男女全黄大片一级 | 丁香月婷婷| 49pao强力免费打造在线高清 | 免费看男女做好爽好硬视频 | 久久精品94精品久久精品 | 国产三a级日本三级日产三级 | 伦理片日本韩国电影三级在线观看 | 伊人手机在线观看 | 黄色在线视频免费 | 亚洲午夜久久久精品影院视色 | 日韩天堂 | 84pao强力永久免费高清 | 九九热免费观看 | 免费观看欧美成人1314w色 | 黄色美女网址 | 精品特级毛片 | 色之综综 | 国产在线观看福利 | 天天插综合 | 上一篇26p国模| 天天摸夜夜添狠狠添2018 | 特别黄的免费视频大片 | 亚洲黄色天堂 | 国产成人黄网址在线视频 | 亚洲国产成人精品青青草原100 | www.成人av.com | 五月天丁香花婷婷 | 色视频免费国产观看 | 香港经典a毛片免费观看爽爽影院 | 亚洲操操操 | 艹逼视频免费看 |