快速初始化記憶體 2

2021-06-16 01:04:13 字數 1353 閱讀 6772

因為我們使用靜態庫鏈結,intel版本在**中是乙個函式呼叫。跟蹤進入,可以發現intel的實現在第一次呼叫時會先檢測cpu型別,然後根據cpu型別跳轉到不同的實現。在p4 機器上,其主迴圈如下:

00401a40subecx,80h

00401a46movdqaxmmword ptr [edx],xmm0

00401a4amovdqaxmmword ptr [edx+10h],xmm0

00401a4fmovdqaxmmword ptr [edx+20h],xmm0

00401a54movdqaxmmword ptr [edx+30h],xmm0

00401a59movdqaxmmword ptr [edx+40h],xmm0

00401a5emovdqaxmmword ptr [edx+50h],xmm0

00401a63movdqaxmmword ptr [edx+60h],xmm0

00401a68movdqaxmmword ptr [edx+70h],xmm0

00401a6daddedx,80h

00401a73cmpecx,80h

00401a79jge___intel_new_memset+750h (00401a40)

可見intel的實現使用了sse2的128位xmm暫存器,並且為了促使指令並行,放置了8條複製指令,這樣每個迴圈能夠複製128×8=512 bit。

msc版本:

42:for (j=0; j< looptimes; j++)

43:{

44:memset(lpbyte,1,size);

0040103bmovecx,1900000h

00401040moveax,1010101h

00401045movedi,ebx

00401047decedx

00401048rep stosdword ptr [edi]

0040104ajnethreadfunc+3bh (0040103b)

如果是debug版本,因為微軟提供了crt的sourcecode,可以跟蹤其彙編實現,在release版本,優化結果為把函式呼叫展開,但因為這裡的實現只使用了普通的386指令按dword傳送資料,所以在效能上會有如此大的差異。

另外,如果測試**中的size定義為較小的值,比如1024*128,在l2 cache為512k的p4上,兩種方法的執行結果相差不大,由此可見cache對區域性訪問的促進作用。

說明:以上例子在vc6和vc7中的結果相同。如果直接用intel編譯器編譯,直接使用memset即可,intel編譯器在遇到memset時實際上編譯為__vec_memset,然後鏈結到intel的runtime庫上。

記憶體初始化

電容的分類 dram 基本原件是電容,需要定時重新整理,儲存速度較慢 dram又分為 sram 同步動態隨機儲存器 synchronous dynamic random access memory ddr 雙倍速率同步動態隨機儲存器 double data rate sdram ddr2 在 ddr...

記憶體初始化過程

1,物理記憶體資訊的獲取 0x15中斷,功能號 e820h,e801h,e88h 見檔案 linux arch i386 boot setup.s 執行完上面的 後,記憶體資訊被分為多條資訊放在e820map位置處,每個資訊條目長20位元組,包含乙個記憶體區間的資訊,條目數放在e820nr處。即實際...

2 應用初始化

angularjs應用引導過程有3個重要點 注入器 injector 將用於建立此應用程式的依賴注入 dependency injection 注入器將會建立根作用域作為我們應用模型的範圍 angular的自動初始化發生在兩個時機 建立應用所需的injector 依賴注入 如果你想在初始化階段擁有更...