簡體   English   中英

在C程序中創建數據危害

[英]Create a Data Hazard in a C Program

我正在嘗試在不同的C程序中創建不同方案的問題,例如

  • 資料危害
  • 分行評估
  • 程序調用

這是在嘗試了解流水線以及出現的各種危險的嘗試。

因此,我正在編寫簡單的C程序,並反匯編為匯編語言,以查看是否會造成危險。 但我不知道如何制造這些危險。 你們都知道我該怎么做嗎? 這是我編寫的一些簡單代碼。

我編譯使用。

gcc -g -c programName.c -o programName.o
gcc programName.o -o programName
objdump -d programName.o > programName.asm

碼:

#include <stdio.h>
int main()
{
    int i = 0;
    int size = 5;
    int num[5] = {1,2,3,4,5};
    int sum=0;
    int average = 0;

    for(i = 0; i < size; i++)
    {
        sum += num[i];
    }

    average=sum/size;

    return 0;
}

...這是該程序集。

average.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 <main>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   c7 45 f0 00 00 00 00    movl   $0x0,0xfffffffffffffff0(%rbp)
   b:   c7 45 f4 05 00 00 00    movl   $0x5,0xfffffffffffffff4(%rbp)
  12:   c7 45 d0 01 00 00 00    movl   $0x1,0xffffffffffffffd0(%rbp)
  19:   c7 45 d4 02 00 00 00    movl   $0x2,0xffffffffffffffd4(%rbp)
  20:   c7 45 d8 03 00 00 00    movl   $0x3,0xffffffffffffffd8(%rbp)
  27:   c7 45 dc 04 00 00 00    movl   $0x4,0xffffffffffffffdc(%rbp)
  2e:   c7 45 e0 05 00 00 00    movl   $0x5,0xffffffffffffffe0(%rbp)
  35:   c7 45 f8 00 00 00 00    movl   $0x0,0xfffffffffffffff8(%rbp)
  3c:   c7 45 fc 00 00 00 00    movl   $0x0,0xfffffffffffffffc(%rbp)
  43:   c7 45 f0 00 00 00 00    movl   $0x0,0xfffffffffffffff0(%rbp)
  4a:   eb 10                   jmp    5c <main+0x5c>
  4c:   8b 45 f0                mov    0xfffffffffffffff0(%rbp),%eax
  4f:   48 98                   cltq   
  51:   8b 44 85 d0             mov    0xffffffffffffffd0(%rbp,%rax,4),%eax
  55:   01 45 f8                add    %eax,0xfffffffffffffff8(%rbp)
  58:   83 45 f0 01             addl   $0x1,0xfffffffffffffff0(%rbp)
  5c:   8b 45 f0                mov    0xfffffffffffffff0(%rbp),%eax
  5f:   3b 45 f4                cmp    0xfffffffffffffff4(%rbp),%eax
  62:   7c e8                   jl     4c <main+0x4c>
  64:   8b 55 f8                mov    0xfffffffffffffff8(%rbp),%edx
  67:   89 d0                   mov    %edx,%eax
  69:   c1 fa 1f                sar    $0x1f,%edx
  6c:   f7 7d f4                idivl  0xfffffffffffffff4(%rbp)
  6f:   89 45 fc                mov    %eax,0xfffffffffffffffc(%rbp)
  72:   b8 00 00 00 00          mov    $0x0,%eax
  77:   c9                      leaveq 
  78:   c3                      retq   

將不勝感激或幫助。 謝謝!

由於這是家庭作業,因此我不會給您一個直截了當的答案,但是請您多加一些思考,以幫助您朝正確的方向發展。

x86是一種可怕的ISA,用於嘗試理解流水線。 一條x86指令可以隱藏兩個或三個副作用,即使是最簡單的流水線也很難弄清給定指令的執行方式。 您確定沒有提供用於此問題的RISC ISA嗎?

將循環/危險代碼放入函數中,最好隨機化數組的創建。 使陣列更長。 一個好的編譯器將基本上找出答案,否則將刪除您編寫的大多數代碼! 由於某些原因,我不明白這是將變量存儲在內存中。

一個好的編譯器還會做一些事情,例如展開循環,以試圖隱藏數據危險並獲得更好的代碼調度。 了解如何克服這種情況(或者,如果可以的話,給標志賦予編譯器告訴它如果允許編譯器亂搞,則不要執行這些操作)。

關鍵字“ volatile”在告訴編譯器不要對某些變量進行優化時非常有用(它告訴編譯器此值隨時可能發生變化,因此請不要聰明地使用它來優化代碼,也不要這樣做)將變量保留在寄存器文件中)。

數據危險意味着管道將暫停等待數據。 通常,指令會及時被繞開,因此不會發生停頓。 考慮一下可能無法繞過哪些類型的指令,並且可能導致數據危險停滯。 這取決於流水線,因此停頓在特定處理器上的代碼可能不會停頓在另一個處理器上。 現代亂序的英特爾處理器非常擅長避免這些停頓,而編譯器則擅長重新調度代碼,因此即使在有序內核上也不會出現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM