指令流水線ppt課件
《指令流水線ppt課件》由會員分享,可在線閱讀,更多相關(guān)《指令流水線ppt課件(129頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第一講流水線數(shù)據(jù)通路和控制邏輯第二講流水線冒險處理第三講高級流水線技術(shù) Ch7 InstructionPipeline指令流水線 第一講流水線數(shù)據(jù)通路和控制 日常生活中的流水線處理例子 洗衣服單周期處理器模型和流水線性能比較什么樣的指令集適合于流水線方式執(zhí)行如何設(shè)計流水線數(shù)據(jù)通路以MIPS指令子集來說明如何設(shè)計流水線控制邏輯分析每條指令執(zhí)行過程中的控制信號給出控制器設(shè)計過程流水線冒險的概念 主要內(nèi)容 復(fù)習(xí) ASingleCycleProcessor 32 ALUctr Clk busW RegWr 32 32 busA 32 busB 5 5 5 Rw Ra Rb 3232 bitRegisters Rs Rt Rt Rd RegDst Extender Mux Mux 32 16 imm16 ALUSrc ExtOp Mux MemtoReg Clk DataIn WrEn 32 Adr DataMemory 32 MemWr ALU Zero 0 1 0 1 0 1 InstructionFetchUnit Clk Instruction Jump Branch Imm16 Rd MainControl op ALUControl func ALUop 3 RegDst ALUSrc Instr Zero 3 復(fù)習(xí) MultipleCycleProcessor MCP 一個功能部件在一個指令周期中可以被使用多次 IdealMemory WrAdr Din RAdr 32 32 32 Dout MemWr 32 32 ALUOp InstructionReg 32 IRWr 32 RegFile Ra Rw busW Rb 5 5 32 busA 32 busB RegWr Rs Rt Rt Rd PCWr ALUSelA RegDst 32 PC MemtoReg ExtOp 32 0 1 2 3 4 Imm 32 ALUSelB Mux 1 0 Zero Zero PCWrCond PCSrc BrWr 32 IorD 復(fù)習(xí) TimingDiagramofaLoadInstruction Clk PC Rs Rt Rd Op Func Clk to Q ALUctr InstructionMemoryAccessTime OldValue NewValue RegWr OldValue NewValue DelaythroughControlLogic busA RegisterFileAccessTime OldValue NewValue busB ALUDelay OldValue NewValue OldValue NewValue NewValue OldValue ExtOp OldValue NewValue ALUSrc OldValue NewValue Address OldValue NewValue busW OldValue New DelaythroughExtender Mux DataMemoryAccessTime InstructionFetch InstrDecode Reg Fetch Address RegWr DataMemory RegisterFileWriteTime 1 3 2 LaundryExampleAnn Brian Cathy Daveeachhaveoneloadofclothestowash dry andfoldWashertakes30minutesDryertakes40minutes Folder takes20minutes Pipelining It sNatural 一個日常生活中的例子 洗衣服 如果讓你來管理洗衣店 你會如何安排 SequentialLaundry 串行方式 串行方式下 4批衣服需要花費6小時 4x 30 40 20 360分鐘 N批衣服 需花費的時間為Nx 30 40 20 90N如果用流水線方式洗衣服 則花多少時間呢 30 40 20 30 40 20 30 40 20 30 40 20 6PM 7 8 9 10 11 Midnight TaskOrder Time PipelinedLaundry StartworkASAP 串行為90分鐘x4 6小時N批則為90 xN分鐘 6PM 7 8 9 10 11 Midnight TaskOrder Time 流水線方式下 需30 4x40 20 210分 3 5小時 如果有N批衣服呢 30 Nx40 20分鐘假定每一步時間均衡 則比串行方式提高約3倍 流水方式下 所用時間主要與最長階段的時間有關(guān) 復(fù)習(xí) Load指令的5個階段 Ifetch 取指 取指令并計算PC 4 用到哪些部件 Reg Dec 取數(shù)和譯碼 取數(shù)同時譯碼 用到哪些部件 Exec 執(zhí)行 計算內(nèi)存單元地址 用到哪些部件 Mem 讀存儲器 從數(shù)據(jù)存儲器中讀 用到哪些部件 Wr 寫寄存器 將數(shù)據(jù)寫到寄存器中 用到哪些部件 指令存儲器 Adder 寄存器堆讀口 指令譯碼器 擴(kuò)展器 ALU 數(shù)據(jù)存儲器 寄存器堆寫口 這里寄存器堆的讀口和寫口可看成兩個不同的部件 指令的執(zhí)行過程是否和 洗衣 過程類似 是否可以采用類似方式來執(zhí)行指令呢 單周期指令模型與流水模型的性能比較 假定以下每步操作所花時間為 取指 2ns寄存器讀 1nsALU操作 2ns存儲器讀 2ns寄存器寫 1ns單周期模型每條指令在一個時鐘周期內(nèi)完成時鐘周期等于最長的lw指令的執(zhí)行時間 即 8ns串行執(zhí)行時 N條指令的執(zhí)行時間為 8Nns流水線性能時鐘周期等于最長階段所花時間為 2ns每條指令的執(zhí)行時間為 2nsx5 10nsN條指令的執(zhí)行時間為 4 N x2ns在N很大時 比串行方式提高約4倍若各階段操作均衡 例如 各階段都是2ns 則提高倍數(shù)為5倍 Load指令執(zhí)行時間總計為 8ns 假定控制單元 PC訪問 信號傳遞等沒有延遲 流水線方式下 單條指令執(zhí)行時間不能縮短 但能大大提高指令吞吐率 流水線指令集的設(shè)計 具有什么特征的指令集有利于流水線執(zhí)行呢 長度盡量一致 有利于簡化取指令和指令譯碼操作MIPS指令32位 下址計算方便 PC 4X86指令從1字節(jié)到17字節(jié)不等 使取指部件極其復(fù)雜格式少 且源寄存器位置相同 有利于在指令未知時就可取操作數(shù)MIPS指令的rs和rt位置一定 在指令譯碼時就可讀rs和rt的值若位置隨指令不同而不同 則需先確定指令類型才能取寄存器編號load Store指令才能訪問存儲器 有利于減少操作步驟 規(guī)整流水線lw sw指令的地址計算和運算指令的執(zhí)行步驟規(guī)整在同一個周期X86運算類指令操作數(shù)可為內(nèi)存數(shù)據(jù) 需計算地址 訪存 執(zhí)行內(nèi)存中 對齊 存放 有利于減少訪存次數(shù)和流水線的規(guī)整總之 規(guī)整 簡單和一致等特性有利于指令的流水線執(zhí)行 Load指令的流水線 Clock Cycle1 Cycle2 Cycle3 Cycle4 Cycle5 Cycle6 Cycle7 2ndlw 3rdlw 每個周期有五個功能部件同時在工作后面指令在前面完成取指后馬上開始每個load指令仍然需要五個周期完成但是 吞吐率 throughput 提高許多 理想情況下 有 每個周期有一條指令進(jìn)入流水線每個周期都有一條指令完成每條指令的有效周期 CPI 為1 R type指令的4個階段 Ifetch 取指令并計算PC 4Reg Dec 從寄存器取數(shù) 同時指令在譯碼器進(jìn)行譯碼Exec 在ALU中對操作數(shù)進(jìn)行計算Wr ALU計算的結(jié)果寫到寄存器 含R type和Load指令的流水線 上述流水線有個問題 兩條指令試圖同時寫寄存器 因為Load在第5階段用寄存器寫口R type在第4階段用寄存器寫口把一個功能部件同時被多條指令使用的現(xiàn)象稱為結(jié)構(gòu)冒險 StrutureHazard 為了流水線能順利工作 規(guī)定 每個功能部件每條指令只能用一次 如 寫口不能用兩次或以上 每個功能部件必須在相同的階段被使用 如 寫口總是在第五階段被使用 R type R type Clock Cycle1 Cycle2 Cycle3 Cycle4 Cycle5 Cycle6 Cycle7 Cycle8 Cycle9 R type R type Load 或稱為資源沖突 R type的Wr操作延后一個周期執(zhí)行 加一個NOP階段以延遲 寫 操作 把 寫 操作安排在第5階段 這樣使R Type的Mem階段為空NOP 這樣使流水線中的每條指令都有相同多個階段 R type 1 2 3 4 5 Store指令的四個階段 Ifetch 取指令并計算PC 4Reg Dec 從寄存器取數(shù) 同時指令在譯碼器進(jìn)行譯碼Exec 16位立即數(shù)符號擴(kuò)展后與寄存器值相加 計算主存地址Mem 將寄存器讀出的數(shù)據(jù)寫到主存 Wr 加一個空的寫階段 使流水線更規(guī)整 NOOP Beq的四個階段 Ifetch 取指令并計算PC 4Reg Dec 從寄存器取數(shù) 同時指令在譯碼器進(jìn)行譯碼Exec 執(zhí)行階段ALU中比較兩個寄存器的大小 做減法 Adder中計算轉(zhuǎn)移地址Mem 如果比較相等 則 轉(zhuǎn)移目標(biāo)地址寫到PC NOOP Wr 加一個空寫階段 使流水線更規(guī)整 與多周期通路有什么不同 多周期通路中 在Reg Dec階段投機(jī)進(jìn)行了轉(zhuǎn)移地址的計算 可以減少Branch指令的時鐘數(shù) 為什么流水線中不進(jìn)行 投機(jī) 計算 因為流水線中所有指令的執(zhí)行階段一樣多 Branch指令無需節(jié)省時鐘 因為有比它更復(fù)雜的指令 按照上述方式 把所有指令都按照最復(fù)雜的 load 指令所需的五個階段來劃分 不需要的階段加一個 NOP 操作 APipelinedDatapath 五階段流水線數(shù)據(jù)通路 IF IDRegister ID ExRegister Ex MemRegister Mem WrRegister PC DataMem WA Di RA Do IUnit A I RFile Di Ra Rb Rw MemWr RegWr ExtOp ExecUnit busA busB Imm ALUOp ALUSrc MemtoReg 1 0 RegDst Rt Rd Imm PC 4 PC 4 Rs Rt PC 4 Zero Branch 1 0 下面看每條指令在流水線通路中的執(zhí)行過程 Wr階段沒有DataPath嗎 為什么需要這些Reg 保存每個周期執(zhí)行的結(jié)果 屬于內(nèi)部寄存器 對程序員透明 不需作為現(xiàn)場保存 不包含控制邏輯 取指令 Ifetch 階段 IF ID lw 1 100 2 ID ExRegister Ex MemRegister Mem WrRegister PC 14 DataMem WA Di RA Do IUnit A I RFile Di Ra Rb Rw MemWr RegWr ExtOp ExecUnit busA busB Imm ALUOp ALUSrc MemtoReg 1 0 RegDst Rt Rd Imm PC 4 PC 4 Rs Rt PC 4 Zero Branch 1 0 Clk Ifetch Reg Dec Exec Mem 第10單元指令 lw 1 0 x100 2 功能 1 Mem 2 0 x100 有誰發(fā)現(xiàn)這里的一個假設(shè)有問題嗎 下一目標(biāo) 設(shè)計IUnit 功能是啥 MIPS指令的地址可能是10嗎 先猜一下IUnit中有哪些功能部件 指令部件IUnit的設(shè)計 第10單元指令 lw 1 0 x100 2 隨后的指令在14號單元中 IF ID lw 1 100 2 PC 14 1 0 10 InstructionMemory 4 Instruction Address Clk Ifetch Reg Dec 取指階段有哪些控制信號 不需控制信號 因為每條指令執(zhí)行功能一樣 是確定的 無需根據(jù)指令的不同來控制執(zhí)行不同的操作 指令部件功能 Instr Mem PC PC PC 4 應(yīng)把哪些信息存到流水段寄存器IF ID中 應(yīng)保存后面階段用到的指令和PC 4的值 指令在隨后階段被送出譯碼 PC 4用來計算轉(zhuǎn)移目標(biāo)地址 譯碼 取數(shù) Reg Dec 階段 IF ID ID Ex Reg 2 0 x100 Ex MemRegister Mem WrRegister PC DataMem WA Di RA Do IUnit A I RFile Di Ra Rb Rw MemWr RegWr ExtOp ExecUnit busA busB Imm ALUOp ALUSrc MemtoReg 1 0 RegDst Rt Rd Imm PC 4 PC 4 Rs Rt PC 4 Zero Branch 1 0 Clk Ifetch Reg Dec Exec Mem Location10 lw 1 0 x100 2 功能 1 Mem 2 0 x100 Reg Rs Reg Rt Rt Rd Imm16 PC 4等被保存在ID EXE中 該階段有哪些控制信號 沒有 因是所有指令的公共操作 故無控制信號 指令還要存ID EX中嗎 不要 只要存相關(guān)信息 Load指令的地址計算階段 IF ID ID ExRegister Ex Mem Load sAddress Mem WrRegister PC DataMem WA Di RA Do IUnit A I RFile Di Ra Rb Rw MemWr RegWr ExecUnit busA busB Imm MemtoReg 1 0 Rt Rd Imm PC 4 PC 4 Rs Rt PC 4 Zero Branch 1 0 Clk Ifetch Reg Dec Exec Mem Location10 lw 1 0 x100 2 功能 1 Mem 2 0 x100 目的寄存器Rt不傳遞下去會怎樣 連接到錯誤的目的地址 指令執(zhí)行錯誤 猜有哪些部件 執(zhí)行部件 ExecUnit 的設(shè)計 ID ExRegister Ex Mem Load sMemoryAddress ALUctr 32 busA 32 busB Extender Mux 16 imm ALUSrc ExtOp 3 ALU Zero 0 1 32 ALUout 32 3 ALUOp 2 32 PC 4 Target 32 Clk Exec Mem Adder用于計算分支指令的轉(zhuǎn)移地址 RegDes 0 ALUSrc 1ALUop addu Extop 1 Load指令的各控制信號取值 執(zhí)行部件功能 計算內(nèi)存地址計算轉(zhuǎn)移目標(biāo)地址一般ALU運算 Branch指令呢 RegDes x ALUSrc 0ALUop subu Extop 1 Store指令呢 RegDes x ALUSrc 1ALUop addu Extop 1 Ori指令呢 RegDes 0 ALUSrc 1ALUop or Extop 0 R型指令呢 RegDes 1 ALUSrc 0ALUop func Extop x Load指令的存儲器讀 Mem 周期 IF ID ID ExRegister Ex MemRegister Mem Wr Load sData PC DataMem WA Di RA Do IUnit A I RFile Di Ra Rb Rw MemWr 0 RegWr ExtOp ExecUnit busA busB Imm ALUOp ALUSrc MemtoReg 1 0 RegDst Rt Rd Imm PC 4 PC 4 Rs Rt PC 4 Zero Branch 0 1 0 Clk Ifetch Reg Dec Exec Mem Location10 lw 1 0 x100 2 功能 1 Mem 2 0 x100 周期以最長操作為準(zhǔn)設(shè)計Cycle Tread 比較洗衣流水線 指令流水有什么不同 洗衣流程不能反向進(jìn)行 但 該階段有反向數(shù)據(jù)流 可能會引起冒險 以后介紹 Load指令的回寫 WriteBack 階段 IF ID ID ExRegister Ex MemRegister Mem WrRegister PC DataMem WA Di RA Do IUnit A I RFile Di Ra Rb Rw MemWr RegWr 1 ExtOp ExecUnit busA busB Imm ALUOp ALUSrc MemtoReg 1 1 0 RegDst Rt Rd Imm PC 4 PC 4 Rs Rt PC 4 Zero Branch 1 0 Clk Ifetch Reg Dec Exec Mem Location10 lw 1 0 x100 2 功能 1 Mem 2 0 x100 Wr 各階段所經(jīng)DataPath已有 控制信號如何得到 該階段有反向數(shù)據(jù)流 可能會引起冒險 以后介紹 流水線中的ControlSignals如何獲得 主要考察 第N階段的控制信號 它取決于是某條指令的某個階段 N Exec Mem Wr 只有這三個階段有控制信號 例 Load的Exec段的控制信號 Func Load sExec 為什么1st和2nd階段沒有控制信號 IF和ID階段的功能對每條指令來說都一樣 Load指令 流水線中的控制信號 在取數(shù) 譯碼 Reg Dec 階段產(chǎn)生本指令每個階段的所有控制信號Exec信號 ExtOp ALUSrc 在1個周期后使用Mem信號 MemWr Branch 在2個周期后使用Wr信號 MemtoReg RegWr 在3個周期后使用 各流水段部件在一個時鐘內(nèi)完成某條指令的某個階段的工作 所以 控制信號也要保存在流水段寄存器中 在下個時鐘到達(dá)時 把執(zhí)行結(jié)果以及前面?zhèn)鬟f來的后面各階段要用到的所有數(shù)據(jù) 如 指令 立即數(shù) 目的寄存器等 和控制信號保存到流水線寄存器中 流水線中的ControlSignals 通過對前面流水線數(shù)據(jù)通路的分析 得知 PC需要寫使能嗎 流水段寄存器需要寫使能嗎 Ifecth階段和Dec Reg階段都沒有控制信號Exec階段的控制信號有四個ExtOp 擴(kuò)展器操作 1 符號擴(kuò)展 0 零擴(kuò)展ALUSrc ALU的B口來源 1 來源于擴(kuò)展器 0 來源于BusBALUOp 主控制器輸出 用于輔助局部ALU控制邏輯來決定ALUCtrl RegDst 指定目的寄存器 1 Rd 0 RtMem階段的控制信號有兩個MemWr DM的寫信號 Store指令時為1 其他指令為0Branch 是否為分支指令 分支指令時為1 其他指令為0Wr階段的控制信號有兩個MemtoReg 寄存器的寫入源 1 DM輸出 0 ALU輸出RegWr 寄存器堆寫信號 結(jié)果寫寄存器的指令都為1 其他指令為0 每個時鐘都會改變PC 故不需要 每個時鐘都會改變流水段寄存器 故不需要 控制邏輯Control 的設(shè)計 流水線控制邏輯的設(shè)計每條指令的控制信號在該指令執(zhí)行期間變不變 誰記得單周期和多周期時各是怎樣的情況 與單周期還是多周期的控制邏輯設(shè)計類似 誰記得單周期和多周期控制邏輯各是怎樣設(shè)計的 設(shè)計過程控制邏輯分成兩部分主控制邏輯 生成ALUop和其他控制信號局部ALU控制邏輯 根據(jù)ALUop和func字段生成ALUCtrl用真值表建立指令和控制信號之間的關(guān)系寫出每個控制信號的邏輯表達(dá)式控制邏輯的輸出 控制信號 在ID階段生成 并存放在ID EX流水段寄存器中 然后每來一個時鐘跟著指令傳送到下一級流水段寄存器某時刻在不同階段同時執(zhí)行不同指令 不同的指令得到不同控制信號 忘記單周期和多周期控制器設(shè)計的同學(xué) 復(fù)習(xí)一下第六章 不變 單周期 藍(lán)色部分是控制信號 Load指令 流水線中的控制信號 在取數(shù) 譯碼 Reg Dec 階段產(chǎn)生本指令每個階段的所有控制信號Exec信號 ExtOp ALUSrc 在1個周期后使用Mem信號 MemWr Branch 在2個周期后使用Wr信號 MemtoReg RegWr 在3個周期后使用 保存在流水段寄存器中的信息 包括前面階段傳遞來或執(zhí)行的結(jié)果及控制信號 一起被傳遞到下一個流水段 所以 控制信號也要保存在流水段寄存器中 Rt和Data在RegWr后到達(dá)咋辦 Wr階段的開始 存在一個實際的問題 在流水線中也存在地址和寫使能之間的 競爭 問題Wr段開始時若RegAdr s Rd Rt Clk to Q RegWr sClk to Q 則錯寫寄存器 Mem階段開始時若WrAdr sClk to Q MemWr sClk to Q 則錯寫存儲器 不能用多周期中的方法 為什么 Ex Mem Mem Wr RegAdr RegWr MemWr Data WrAdr Data RegFile DataMemory Clk RegAdr RegWr RegWr sClk to Q RegAdr sClk to Q Clk WrAdr MemWr MemWr sClk to Q WrAdr sClk to Q 哪個同學(xué)記得多周期中是如何處理 競爭 問題的 流水線中的 競爭 問題 多周期中解決Addr和WrEn之間競爭問題的方法 在第N周期結(jié)束時 讓Addr信號有效在第N 1周期讓W(xué)rEn有效上述方法在流水線設(shè)計中不能用 因為 每個周期必須能夠?qū)慠egister每個周期必須能夠?qū)慚emory Clock Store Store R type R type 如何解決 寄存器組的同步和存儲器的同步 解決方案 將WriteEnable和時鐘信號相 與 1 Addr Data和WrEn必須在Clk邊沿到來后至少穩(wěn)定一個set up時間2 Clk高電平時間大于寫入時間 須由電路專家確保不會發(fā)生 定時錯誤 即 能合理設(shè)計 Clock 相當(dāng)于單周期通路中的理想寄存器和理想存儲器 流水線舉例 考察流水線DataPath的數(shù)據(jù)流動情況 EndofCycle4 EndofCycle5 EndofCycle6 EndofCycle7 EndofCycle4 Load sMem R type sExec Store sReg Beq sIfetchEndofCycle5 Load sWr R type sMem Store sExec Beq sRegEndofCycle6 R type sWr Store sMem Beq sExecEndofCycle7 Store sWr Beq sMem 考察以下幾個點的情況 說明 后面僅考察數(shù)據(jù)流動情況 控制信號隨數(shù)據(jù)同步流動不再說明 第四周期結(jié)束時的狀態(tài) 0 Load sMem4 R type sExec8 Store sReg12 Beq sIfetch IF ID BeqInstruction ID Ex Store sbusA B Ex Mem R type sResult Mem Wr Load sDout PC 16 DataMem WA Di RA Do IUnit A I RFile Di Ra Rb Rw RegWr ExtOp x ExecUnit busA busB Imm ALUOp R type ALUSrc 0 MemtoReg 1 0 RegDst 1 Rt Rd Imm PC 4 PC 4 Rs Rt PC 4 Zero Branch 0 1 0 12 Beq sIfet 8 Store sReg 4 R type sExec 0 Load sMem MemWr 0 Clk 如果Mem階段是Branch且Zero為1 會怎樣 sWr 第五周期結(jié)束時的狀態(tài) 0 Lw sWr4 R sMem8 Store sExec12 Beq sReg16 R sIfetch IF ID Instruction 16 ID Ex Beq sbusA B Ex Mem Store sAddress Mem Wr R type sResult PC 16 DataMem WA Di RA Do IUnit A I RFile Di Ra Rb Rw RegWr 1 ExtOp 1 ExecUnit busA busB Imm ALUOp Addu ALUSrc 1 MemtoReg 1 1 0 RegDst x Rt Rd Imm PC 4 PC 4 Rs Rt PC 4 Zero Branch 0 1 0 16 R sIfet 12 Beq sReg 8 Store sExec 4 R type sMem MemWr 0 Clk 同一周期寄存器有讀和寫 可能嗎 利用時鐘上升和下降沿兩次觸發(fā) 能做到前半周期寫 后半周期讀 寄存器的寫口和讀口可看成是獨立的兩個部件 20 第六周期結(jié)束時的狀態(tài) 4 R sWr8 Store sMem12 Beq sExec16 R sReg20 R sIfet IF ID Instruction 20 ID Ex R type sbusA B Ex Mem Beq sResults Mem Wr NothingforSt PC 24 DataMem WA Di RA Do IUnit A I RFile Di Ra Rb Rw RegWr 1 ExtOp 1 ExecUnit busA busB Imm ALUOp Subu ALUSrc 0 MemtoReg 0 1 0 RegDst x Rt Rd Imm PC 4 PC 4 Rs Rt PC 4 Zero Branch 0 1 0 20 R type sIfet 16 R type sReg 12 Beq sExec 8 Store sMem 4 R type sWr MemWr 1 Clk Ifetch和Reg兩個周期每條指令執(zhí)行的都一樣 第七周期結(jié)束時的狀態(tài) 8 Store sWr12 Beq sMem16 R sExec20 R sReg24 R sIfet IF ID Instruction 24 ID Ex R type sbusA B Ex Mem Rtype sResults Mem Wr NothingforBeq PC 1000 DataMem WA Di RA Do IUnit A I RFile Di Ra Rb Rw RegWr 0 ExtOp x ExecUnit busA busB Imm ALUOp R type ALUSrc 0 MemtoReg x 1 0 RegDst 1 Rt Rd Imm PC 4 PC 4 Rs Rt PC 4 Zero Branch 1 1 0 24 R type sIfet 20 R type sReg 16 R type sExec 12 Beq sMem 8 Store sWr MemWr 0 Clk 假定相等 則Zero 1轉(zhuǎn)移目標(biāo)地址送PC 這里出現(xiàn)反向數(shù)據(jù)流 轉(zhuǎn)移目標(biāo)地址反向送給PC可能會導(dǎo)致控制冒險 總結(jié)前面的流水線執(zhí)行過程 回憶剛才的過程 回答以下問題 Branch指令何時確定是否轉(zhuǎn)移 轉(zhuǎn)移目標(biāo)地址在第幾周期計算出來 第六周期得到Zero和轉(zhuǎn)移地址 第七周期控制轉(zhuǎn)移地址送到PC輸入端 第八周期開始才能根據(jù)轉(zhuǎn)移地址取指令如果Branch指令執(zhí)行結(jié)果是需要轉(zhuǎn)移 稱為taken 則流水線會怎樣 Load指令何時能把數(shù)據(jù)寫到寄存器 第幾周期開始寫數(shù)據(jù) 第五周期寫入 第六周期開始才能使用如果后面R Type的操作數(shù)是load指令目標(biāo)寄存器的內(nèi)容 則流水線怎樣 Clock Cycle1 Cycle2 Cycle3 Cycle4 Cycle5 Cycle6 Cycle7 Cycle8 0 Load 4 R type 8 Store 12 Beq targetis1000 16 R type 24 R type 20 R type 1000 TargetofBr 轉(zhuǎn)移分支指令 Branch 引起的 延遲 現(xiàn)象 雖然Beq指令在第四周期取出 但 目標(biāo)地址在第七周期才被送到PC的輸入端第八周期才能取出目標(biāo)地址處的指令執(zhí)行結(jié)果 在取目標(biāo)指令之前 已有三條指令被取出 取錯了三條指令 這種現(xiàn)象稱為控制冒險 ControlHazard 注 也稱為分支冒險或轉(zhuǎn)移冒險 BranchHazard Cycle4 Cycle5 Cycle6 Cycle7 Cycle8 Cycle9 Cycle10 Cycle11 Clk 16 R type 24 R type 12 Beq targetis1000 20 R type 1000 TargetofBr BACK 裝入指令 Load 引起的 延遲 現(xiàn)象 盡管Load指令在第一周期就被取出 但 數(shù)據(jù)在第五周期結(jié)束才被寫入寄存器到第六周期寫入的數(shù)據(jù)才能被用結(jié)果 如果隨后指令要用到Load的數(shù)據(jù)的話 就需延遲三條指令 這種現(xiàn)象被稱為數(shù)據(jù)冒險 DataHazard 或數(shù)據(jù)相關(guān) DataDependency Clock Cycle1 Cycle2 Cycle3 Cycle4 Cycle5 Cycle6 Cycle7 Cycle8 0 Load Plus1 Plus2 Plus3 R Type 第一講內(nèi)容小結(jié) 指令的執(zhí)行可以像洗衣服一樣 用流水線方式進(jìn)行均衡時指令吞吐率提高N倍 但不能縮短一條指令的執(zhí)行時間流水段數(shù)以最復(fù)雜指令所需步驟數(shù)為準(zhǔn) 有些指令的某些階段為空操作 每個階段的寬度以最復(fù)雜階段所需時間為準(zhǔn) 盡量調(diào)整使各階段均衡 以Load指令為準(zhǔn) 分為五個階段取指令段 IF 取指令 計算PC 4 IUnit InstructionMemory Adder 譯碼 讀寄存器 ID RF 段指令譯碼 讀Rs和Rt 寄存器讀口 執(zhí)行 EXE 段計算轉(zhuǎn)移目標(biāo)地址 ALU運算 Extender ALU Adder 存儲器 MEM 段讀或?qū)懘鎯卧?DataMemory 寫寄存器 Wr 段ALU結(jié)果或從DM讀出數(shù)據(jù)寫到寄存器 寄存器寫口 流水線控制器的實現(xiàn)IF和ID RF段不需控制信號控制 只有EXE MEM和Wr需要ID段生成所有控制信號 并隨指令的數(shù)據(jù)同步向后續(xù)階段流動寄存器和存儲器的競爭問題可利用時鐘信號來解決流水線冒險 結(jié)構(gòu)冒險 控制冒險 數(shù)據(jù)冒險 下一講主要介紹解決流水線冒險的數(shù)據(jù)通路如何設(shè)計 第二講流水線冒險的處理 流水線冒險的幾種類型數(shù)據(jù)冒險的現(xiàn)象和對策數(shù)據(jù)冒險的種類相關(guān)的數(shù)據(jù)是ALU結(jié)果 可以通過轉(zhuǎn)發(fā)解決相關(guān)的數(shù)據(jù)是DM讀出的內(nèi)容 隨后的指令需被阻塞一個時鐘數(shù)據(jù)冒險和轉(zhuǎn)發(fā)轉(zhuǎn)發(fā)檢測 轉(zhuǎn)發(fā)控制數(shù)據(jù)冒險和阻塞阻塞檢測 阻塞控制控制冒險的現(xiàn)象和對策靜態(tài)分支預(yù)測技術(shù)動態(tài)分支預(yù)測技術(shù)縮短分支延遲技術(shù)流水線中對異常和中斷的處理訪問缺失對流水線的影響 主要內(nèi)容 Hazards 指流水線遇到無法正確執(zhí)行后續(xù)指令或執(zhí)行了不該執(zhí)行的指令Structuralhazards hardwareresourceconflicts 現(xiàn)象 同一個部件同時被不同指令所使用一個部件每條指令只能使用1次 且只能在特定周期使用設(shè)置多個部件 以避免沖突 如指令存儲器IM和數(shù)據(jù)存儲器DM分開Datahazards datadependencies 現(xiàn)象 后面指令用到前面指令結(jié)果數(shù)據(jù)時 前面指令的結(jié)果還沒產(chǎn)生采用轉(zhuǎn)發(fā) Forwarding Bypassing 技術(shù)Load use冒險需要一次阻塞 stall 編譯程序優(yōu)化指令順序Control Branch hazards changesinprogramflow 現(xiàn)象 轉(zhuǎn)移或異常改變執(zhí)行流程 后繼指令在目標(biāo)地址產(chǎn)生前已被取出采用靜態(tài)或動態(tài)分支預(yù)測編譯程序優(yōu)化指令順序 分支延遲 總結(jié) 流水線的三種沖突 冒險 Hazard 情況 SKIP Mem StructuralHazard 結(jié)構(gòu)冒險 現(xiàn)象 Time clockcycles Load Instr1 Instr2 Instr3 Instr4 Reg Mem Reg Reg Mem Reg Reg Mem Reg Reg Mem Reg Reg Mem Reg 只有一個存儲器時 在Load指令取數(shù)據(jù)同時又取指令的話 則發(fā)生沖突 如果不對寄存器堆的寫口和讀口獨立設(shè)置的話 則發(fā)生沖突 結(jié)構(gòu)冒險也稱硬件資源沖突 同一個執(zhí)行部件被多條指令使用 Reg StructuralHazard的解決方法 Instr Order Time clockcycles Load Instr1 Instr2 Instr3 Instr4 ALU Im Reg Dm Reg Dm Reg Dm Reg ALU Reg Dm Reg Reg Dm Reg 將InstructionMemory Im 和DataMemory Dm 分開將寄存器讀口和寫口獨立開來 Im 為了避免結(jié)構(gòu)冒險 規(guī)定流水線數(shù)據(jù)通路中功能部件的設(shè)置原則為 每個部件在特定的階段被用 如 ALU總在第三階段被用 Reg BACK DataHazard現(xiàn)象 addr1 r2 r3 subr4 r1 r3 andr6 r1 r7 orr8 r1 r9 xorr10 r1 r11 想一下 哪條指令的r1是老的值 哪條是新的值 畫出流水線圖能很清楚理解 舉例說明 以下指令序列中 寄存器r1會發(fā)生數(shù)據(jù)冒險 讀r1時 add指令正在執(zhí)行加法 EXE 老值 讀r1時 add指令正在傳遞加法結(jié)果 MEM 老值 讀r1時 add指令正在寫加法結(jié)果到r1 WB 老值 讀r1時 add指令已經(jīng)把加法結(jié)果寫到r1 新值 補(bǔ)充 三類數(shù)據(jù)冒險現(xiàn)象RAW 寫后讀 基本流水線中經(jīng)常發(fā)生 如上例 WAR 讀后寫 基本流水線中不會發(fā)生 亂序執(zhí)行時會發(fā)生 WAW 寫后寫 基本流水線中不會發(fā)生 亂序執(zhí)行時會發(fā)生 本講介紹基本流水線 所以僅考慮RAW冒險 DataHazardonr1 Instr Order Time clockcycles addr1 r2 r3 subr4 r1 r3 andr6 r1 r7 orr8 r1 r9 xorr10 r1 r11 IF ID RF EX MEM WB ALU Im Reg Dm Reg Reg Dm Reg Reg Dm Reg Im ALU Reg Dm Reg Reg Dm Reg 最后一條指令的r1才是新的值 如何解決這個問題 數(shù)據(jù)冒險的解決方法 方法1 硬件阻塞 stall 方法2 軟件插入 NOP 指令方法3 合理實現(xiàn)寄存器堆的讀 寫操作 不能解決所有數(shù)據(jù)冒險 前半時鐘周期寫 后半時鐘周期讀 若同一個時鐘內(nèi)前面指令寫入的數(shù)據(jù)正好是后面指令所讀數(shù)據(jù) 則不會發(fā)生數(shù)據(jù)冒險方法4 轉(zhuǎn)發(fā) Forwarding或Bypassing旁路 技術(shù)若相關(guān)數(shù)據(jù)是ALU結(jié)果 則如何 可通過轉(zhuǎn)發(fā)解決若相關(guān)數(shù)據(jù)是上條指令DM讀出內(nèi)容 則如何 不能通過轉(zhuǎn)發(fā)解決 隨后指令需被阻塞一個時鐘或加NOP指令方法5 編譯優(yōu)化 調(diào)整指令順序 不能解決所有數(shù)據(jù)冒險 實現(xiàn) 轉(zhuǎn)發(fā) 和 阻塞 要修改數(shù)據(jù)通路 1 檢測何時需要 轉(zhuǎn)發(fā) 并控制實現(xiàn) 轉(zhuǎn)發(fā) 2 檢測何時需要 阻塞 并控制實現(xiàn) 阻塞 稱為Load use數(shù)據(jù)冒險 方案1 在硬件上采取措施 使相關(guān)指令延遲執(zhí)行 Instr Order Time clockcycles addr1 r2 r3 subr4 r1 r3 andr6 r1 r7 IF ID RF EX MEM WB ALU Im Reg Dm Reg Reg Dm Reg stall stall stall Reg Dm 硬件上通過阻塞 stall 方式阻止后續(xù)指令執(zhí)行 延遲到有新值以后 這種做法稱為流水線阻塞 也稱為插入 氣泡Bubble 缺點 控制比較復(fù)雜 需要改數(shù)據(jù)通路 指令被延遲三個時鐘執(zhí)行 方案2 軟件上插入無關(guān)指令 Instr Order Time clockcycles addr1 r2 r3 subr4 r1 r3 andr6 r1 r7 IF ID RF EX MEM WB ALU Im Reg Dm Reg Reg Dm Reg 由編譯器插入三條NOP指令 浪費三條指令的空間和時間 是最差的做法 好處 數(shù)據(jù)通路簡單 即無需改數(shù)據(jù)通路 nop nop nop Reg Dm Reg Dm Reg Reg Dm Reg Im ALU Reg Dm Reg 與方案1比 哪個更快 一樣 都是多三個時鐘周期 方案3 同一周期內(nèi)寄存器堆先寫后讀 Instr Order Time clockcycles addr1 r2 r3 subr4 r1 r3 andr6 r1 r7 orr8 r1 r9 xorr10 r1 r11 IF ID RF EX MEM WB ALU Im Reg Dm Reg Reg Dm Reg Reg Dm Reg Im ALU Reg Dm Reg Reg Dm Reg 寄存器堆的讀口和寫口是相互獨立的部件 寄存器寫口 讀口分別在前 后半周期進(jìn)行操作 使寫入數(shù)據(jù)被直接讀出但是 只能解決部分?jǐn)?shù)據(jù)冒險 方案4 利用DataPath中的中間數(shù)據(jù) 轉(zhuǎn)發(fā) 阻塞 Instr Order Time clockcycles addr1 r2 r3 subr4 r1 r3 andr6 r1 r7 orr8 r1 r9 xorr10 r1 r11 IF ID RF EX MEM WB ALU Im Reg Dm Reg Reg Dm Reg Reg Dm Reg Im ALU Reg Dm Reg Reg Dm Reg 仔細(xì)觀察后發(fā)現(xiàn) 流水段寄存器中已有需要的值r1 把數(shù)據(jù)從流水段寄存器中直接取到ALU的輸入端 在哪個流水段R中 第七周期結(jié)束時的狀態(tài) 8 Store sWr12 Beq sMem16 R sExec20 R sReg24 R sIfet IF ID Instruction 24 ID Ex R type sbusA B Ex Mem Rtype sResults Mem Wr NothingforBeq PC 1000 DataMem WA Di RA Do IUnit A I RFile Di Ra Rb Rw RegWr 0 ExtOp x ExecUnit busA busB Imm ALUOp R type ALUSrc 0 MemtoReg x 1 0 RegDst 1 Rt Rd Imm PC 4 PC 4 Rs Rt PC 4 Zero Branch 1 1 0 24 R type sIfet 20 R type sReg 16 R type sExec 12 Beq sMem 8 Store sWr MemWr 0 Clk 假定相等 則Zero 1轉(zhuǎn)移目標(biāo)地址送PC BACK 硬件上的改動以支持 轉(zhuǎn)發(fā) 技術(shù) 加MUX 使流水段寄存器值返送ALU輸入端 能用 轉(zhuǎn)發(fā) 技術(shù)解決第1 2兩條指令間的數(shù)據(jù)冒險嗎 請看后面的幻燈片 DM ALU 復(fù)習(xí) Load指令引起的延遲現(xiàn)象 Load指令最早在哪個流水線寄存器中開始有后續(xù)指令需要的值 Clock Cycle1 Cycle2 Cycle3 Cycle4 Cycle5 Cycle6 Cycle7 Cycle8 I0 Load Plus1 Plus2 Plus3 Plus4 實際上 在第四周期結(jié)束時 數(shù)據(jù)在流水段寄存器中已經(jīng)有值 采用數(shù)據(jù)轉(zhuǎn)發(fā)技術(shù)可以使load指令后面第二條指令得到所需的值但不能解決load指令和隨后第一條指令間的數(shù)據(jù)冒險 要延遲執(zhí)行一條指令 這種load指令和隨后指令間的數(shù)據(jù)冒險 稱為 裝入 使用數(shù)據(jù)冒險 load useDataHazard 若不采用轉(zhuǎn)發(fā) 在何時才能使用Load指令的結(jié)果 Forwarding 技術(shù)使Load use冒險只需延遲一個周期 Instr Order Time clockcycles lwr1 0 r2 subr7 r1 r3 andr6 r1 r7 orr8 r1 r9 IF ID RF EX MEM WB ALU Im Reg Dm Reg Reg Dm Reg Reg Dm Reg Im ALU Reg Dm Reg 采用 轉(zhuǎn)發(fā) 后僅第二條指令SUBr7 r1 r3不能按時執(zhí)行 發(fā)生 裝入 使用數(shù)據(jù)冒險 時 需要對load后的指令阻塞一個時鐘周期 數(shù)據(jù)冒險處理最佳方案 轉(zhuǎn)發(fā) Load use阻塞 RAW 寫后讀 數(shù)據(jù)冒險的 轉(zhuǎn)發(fā) 條件 后面指令需用ALU輸出結(jié)果C1 目寄是后一條指令的源寄C2 目寄是后第二條指令的源寄 例如 R Type后跟R lw sw beq等 后面指令需用從DM讀出的結(jié)果C3 目寄是后第二指令的源寄 例如 load指令后跟R Type beq等 用流水段寄存器來表示轉(zhuǎn)發(fā)條件 C3以后考慮 C1 a EX MEM RegisterRd ID EX RegisterRsC1 b EX MEM RegisterRd ID EX RegisterRtC2 a MEM WB RegisterRd ID EX RegisterRsC2 b MEM WB RegisterRd ID EX RegisterRt 這里的RegisterRd是指目的寄存器實際上是R type的Rd或I Type的Rt 指令的回寫 WriteBack 階段 IF ID ID ExRegister Ex MemRegister Mem WrRegister PC DataMem WA Di RA Do IUnit A I RFile Di Ra Rb Rw MemWr RegWr 1 ExtOp ExecUnit busA busB Imm ALUOp ALUSrc MemtoReg 1 0 1 0 RegDst Rt Rd Imm PC 4 PC 4 Rs Rt PC 4 Zero Branch 1 0 Clk Ifetch Reg Dec Exec Mem Wr Rd還是Rt取決于是R 型指令 還是I 型指令 若是beq指令會怎樣 beqr3 r2 100addr4 r3 r2subr5 r3 r2 因為beq指令無需寫結(jié)果 故不能進(jìn)行轉(zhuǎn)發(fā) 轉(zhuǎn)發(fā)條件的進(jìn)一步完善 以下兩種情況下 轉(zhuǎn)發(fā)會發(fā)生錯誤指令的結(jié)果不寫入目的寄存器Rd時例如 Beq指令只對rs和rt相減 不寫結(jié)果到目的寄存器Rt即 EX MEM或MEM WB流水段寄存器的RegWr信號為0Rd等于 0時例如 指令sll 0 1 2的轉(zhuǎn)發(fā)結(jié)果為 R 1 2 但實際上應(yīng)該是0因此 修改轉(zhuǎn)發(fā)條件為 C1 a EX MEM RegWrandEX MEM RegisterRd 0andEX MEM RegisterRd ID EX RegisterRsC1 b EX MEM RegWrandEX MEM RegisterRd 0andEX MEM RegisterRd ID EX RegisterRtC2 a MEM WB RegWrandMEM WB RegisterRd 0andMEM WB RegisterRd ID EX RegisterRsC2 b MEM WB RegWrandMEM WB RegisterRd 0andMEM WB RegisterRd ID EX RegisterRt beqr3 r2 100addr4 r3 r2subr5 r3 r2 轉(zhuǎn)發(fā)路徑和轉(zhuǎn)發(fā)條件 加MUX 使流水段寄存器值返送ALU輸入端 紅線和蘭線可以合并 在原數(shù)據(jù)通路中確實是合并在一起的 記得嗎 由一個二路選擇器 控制端為MemtoReg 合并輸出到寄存器堆 所以 無需另有一個檢測條件C3 C3就是C2 C1反映本條指令和隨后指令間的相關(guān)關(guān)系C2反映本條指令和隨后第二條指令間的相關(guān)關(guān)系 C1和C2分別反映哪兩條指令的關(guān)系呢 轉(zhuǎn)發(fā)路徑和轉(zhuǎn)發(fā)條件 轉(zhuǎn)發(fā)檢測 部件中缺何條件 MEM WB RegWr 1 EX MEM RegWr 1 帶轉(zhuǎn)發(fā)的流水線數(shù)據(jù)通路 ForwardA ForwardB 更加復(fù)雜的數(shù)據(jù)冒險問題 考察以下指令序列 采用前述轉(zhuǎn)發(fā)條件會發(fā)生什么情況 add 1 1 2add 1 1 3add 1 1 4 可能會使轉(zhuǎn)發(fā)到第3條指令的操作數(shù)是第1條指令結(jié)果 而不是第2條指令的結(jié)果 怎樣改寫 轉(zhuǎn)發(fā) 檢測條件 改C1還是改C2 需要改寫 轉(zhuǎn)發(fā) 條件C2 a 和C2 b 為 C2 a MEM WB RegWriteand MEM WB RegisterRd 0 and EX MEM RegisterRd ID EX RegisterRs and MEM WB RegisterRd ID EX RegisterRs C2 b MEM WB RegWriteand MEM WB RegisterRd 0 and EX MEM RegisterRd ID EX RegisterRt and MEM WB RegisterRd ID EX RegisterRt 上述公式相當(dāng)于加了一個條件限制 如果本條指令源操作數(shù)和上條指令的目的寄存器一樣 則不轉(zhuǎn)發(fā)上上條指令的結(jié)果 而轉(zhuǎn)發(fā)上條指令的結(jié)果 即 此時的C1 1而C2 0 至此 解決了RAW數(shù)據(jù)冒險的 轉(zhuǎn)發(fā) 處理 對于左邊的指令序列 C1和C2的值各是什么 C1 C2 1 使得Forward信號取值不確定 應(yīng)該讓C1 1 C2 0 所有RAW數(shù)據(jù)冒險都能通過轉(zhuǎn)發(fā)來解決嗎 Load useDataHazard 硬件阻塞方式 Instr Order Time clockcycles lwr1 0 r2 subr4 r1 r3 IF ID RF EX MEM WB ALU Im Reg Dm Reg Im andr6 r1 r7 orr8 r1 r9 Reg Dm Reg Reg Dm Reg Im ALU Reg Dm Reg 需解決以下問題 1 判斷什么條件下需要阻塞 Reg 2 如何修改數(shù)據(jù)通路來實現(xiàn)阻塞 subr4 r1 r3 Load useDataHazard 硬件阻塞方式 Time clockcycles IF ID EX MEM WB ALU Im Reg Dm Reg Reg Dm Reg Reg Dm Reg Im ALU Reg Dm Reg Instr Order lwr1 0 r2 subr4 r1 r3 andr6 r1 r7 orr8 r1 r9 檢測 阻塞 過程中 1 sub指令在IF ID寄存器中 并正被譯碼 控制信號和Rs Rt的值將被寫到ID EX段寄存器2 and指令地址在PC中 正被取出 取出的指令將被寫到IF ID段寄存器中在阻塞點 必須將上述兩條指令的執(zhí)行結(jié)果清除 并延遲一個周期執(zhí)行這兩條指令 阻塞前的情況 延遲一個周期執(zhí)行后面指令 相當(dāng)于把阻塞點前面一個周期的狀態(tài)再保持一個周期lw指令還是繼續(xù)正常執(zhí)行下去 想想看 lw后面的指令如何做到繼續(xù)保持狀態(tài) Load useDataHazard 硬件阻塞方式 在阻塞點 將上述兩條指令的執(zhí)行結(jié)果清除 并延遲一個周期執(zhí)行這兩條指令 將ID EX段寄存器中所有控制信號清0 插入一個 氣泡 IF ID寄存器中的信息不變 還是sub指令 sub指令重新譯碼執(zhí)行 PC中的值不變 還是and指令地址 and指令重新被取出執(zhí)行 Instr Order Time clockcycles lwr1 0 r2 subr4 r1 r3 IF ID RF EX MEM WB ALU Im Reg Dm Reg Im andr6 r1 r7 orr8 r1 r9 Reg Dm Reg Reg Dm Reg Im ALU Reg Dm Reg Reg 阻塞后的情況 帶 轉(zhuǎn)發(fā) 和 阻塞 檢測的流水線數(shù)據(jù)通路 至此 硬件處理數(shù)據(jù)冒險 轉(zhuǎn)發(fā) 阻塞 全部完成 寫使能 信號為0 使PC和IF ID不變 使控制信號清0 阻塞指令執(zhí)行 以下源程序可生成兩種不同的代碼 優(yōu)化的代碼可避免Load阻塞a b c d e f 假定a b c d e f在內(nèi)存 方案5 編譯器進(jìn)行指令順序調(diào)整來解決數(shù)據(jù)冒險 Fastcode lw 2 blw 3 clw 5 eadd 1 2 3lw 6 fsw 1 asub 4 5 6sw 4 d Slowcode lw 2 blw 3 cadd 1 2 3sw 1 alw 5 elw 6 fsub 4 5 6sw 4 d 編譯器的優(yōu)化很重要 如果硬件不支持阻塞處理的話 則編譯器可以將順序調(diào)整和插入NOP指令結(jié)合起來 在找不到可插入的指令時- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
30 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 指令 流水線 ppt 課件
鏈接地址:http://www.3dchina-expo.com/p-5845454.html