2009-02-08 59 views
5

所以我正在教大會,我們有一個任務是找到從內存讀取和從緩存中讀取之間的時間差。我們必須通過創建2個循環並計時來做到這一點。 (一個從主內存中讀取,另一個從緩存中讀取)。事情是,我不知道,也找不到任何告訴我如何從緩存或主內存讀取的任何內容= /。你們能幫我嗎?我在MASM32中做這個。我瞭解如何使環路和最良好的彙編語言,但我就是不能讓它讀=/我如何故意從主內存讀取緩存?


編輯:

我有一個問題,我已經做到了這一點。 ..

mov ecx, 100 ;loop 100 times 
xor eax, eax ;set eax to 0 
_label: 
mov eax, eax ;according to me this is read memory is that good? 
dec ecx ;dec loop 
jnz _label ;if still not equal to 0 goes again to _label 

......那會好嗎?


編輯2:

那好吧,我不打算撬,我很欣賞你的幫助,我只是有一個問題,因爲這是兩個迴路我必須做的。我需要比較它們,我一直在尋找一個計時器指令,但我還沒有找到任何我找到的只有:timeGetTime,GetTickCount性能計數器但據我瞭解這些說明返回系統時間不是循環完成所需的時間。有沒有辦法實際做我想要的?或者我需要考慮另一種方式?

此外,要從第二個循環中的不同寄存器讀取(不從緩存中讀取的),如果我給出各種「mov」指令,可以嗎?還是我完全脫離基地?

對不起所有這些問題,但再次感謝您的幫助。

回答

7

從緩存讀取。有一個循環,從相同(或非常相似)的內存地址上寫着:

  • 你從該地址讀取的第一次,從內存地址的值(和其他鄰近存儲器地址)將被轉移到緩存
  • 下一個當你讀取該相同的地址,值已被緩存,所以你正在讀取緩存。

要讀取未高速緩存的內存,有一個從許多非常不同(即高於緩存大小)內存地址讀取的循環。


要回答你的第二個問題:

  • 的事情你與ECX做和JNZ看起來OK(我不知道如何準確/敏感的計時器,但你可能想循環超過100次)

  • mov eax, eax不是「讀取內存」...它是一個無操作,它將eax移入eax中。相反,我認爲,從內存中讀取MASM語法的東西更像是mov eax,[esi](「從存儲器位置,其地址包含在esi閱讀」)

  • 根據O/S你使用,你有什麼必須從實際存在且可讀的內存地址讀取。例如,在Windows上,應用程序將不被允許執行mov esi, 0,然後執行mov eax, [esi],因爲應用程序不允許讀取地址/位置爲零的存儲器。


要回答你的第三個問題:

timeGetTime,GetTickCount的和性能計數器

你提timeGetTime,GetTickCount的和性能計數器意味着你在Windows下運行。

是的,這些返回當前時間,以各種分辨率/精度:例如,GetTickCount具有約50毫秒的分辨率,所以它無法對持續少於50毫秒的事件計時,對計時事件持續時間不準確只有50-100毫秒。這就是爲什麼我說你的ecx中的100可能不夠大。

QueryPerformanceCounter函數可能是您擁有的最準確的計時器。

要使用這些定時器作爲間隔定時器:

  • 獲取的時候,你開始循環
  • 之前再次獲取的時候,你完成循環
  • 減去這兩個時間後:區別在於時間間隔

如果我給出各種「mov」指令可以嗎?

是的,我認爲是。我想你可以做這樣的(注意我不知道/不記得這是否是從名稱存儲位置讀取正確的語法MASM)...

mov eax,[memory1] 
mov eax,[memory2] 
mov eax,[memory3] 
mov eax,[memory4] 
mov eax,[memory5] 

...其中memory1通過memory5是數據段中廣泛分佈的全局變量的地址。

或者,你可以做...

mov eax,[esi] 
add esi,edx 
mov eax,[esi] 
add esi,edx 
mov eax,[esi] 
add esi,edx 
mov eax,[esi] 
add esi,edx 
mov eax,[esi] 

...其中ESI指向的內存塊長的底部,和EDX是一些增量僅此長度的五分之一等於的大塊。

相關問題