這是cachegrind輸出的一部分。這部分代碼已執行1224次。 elmg1是一個無符號長數組,大小爲16 x 20。我的機器L1高速緩存大小爲32KB,64B高速緩存行大小和8路組相關聯。Cachegrind輸出解釋
- 爲(I = 0;我< 20; i ++在)78336 2448 2 50184 0 0 1224 0 0
- {
- telm01 = elmg1 [I]; 146,880 0 0 73,440 0 0 24,480 0 0
- telm31 =(telm01 < < 3)^ val1; 97,920 0 0 48,960 0 0 24,480 0 0
- telm21 =(telm01 < < 2)^(val1 >> 1); 146,880 1,224 1 48,960 0 0 24,480 0 0
- telm11 =(telm01 < < 1)^(val1 >> 2); 146880 0 0 48960 0 0 24,480 0 0
- }
答:我已經把它放在這裏的原因,就是在裏面的3號線的循環,我看到一些I1的惦記(一個L2錯過)。這有點混亂,我猜不出爲什麼?
B.我想優化(時間)一部分代碼。以上只是一小段片斷。我認爲在我的程序內存中存取成本很高。像上面的例子一樣,elmg1是一個16 x 20大小的無符號長整型數組。當我嘗試在代碼中使用它時,總會有一些錯誤,並且在我的程序中這些變量發生了很多。有什麼建議麼?
C.我需要分配和(有時初始化)這些無符號長整數。你能建議哪一個我更喜歡,calloc或數組聲明,然後顯式初始化。順便說一下,緩存處理它們的方式會有什麼不同嗎?
謝謝。
答:沒關係,但是爲什麼在第5行存在緩存未命中,而第3,4行的存儲空間不足。我是否需要自己指定對齊方式,我讀取默認情況下的malloc提供了8/16字節的對齊方式。 – anup 2010-11-01 08:57:09
是的,malloc應該提供至少8byte的對齊方式,但這與64bytes緩存對齊不一樣。只有當你有一個64bytes的對象數組時,高速緩存對齊纔是重要的。如果數組未分配緩存對齊,則訪問數組中的任何一項可能會導致兩次緩存未命中,而不是一次。但在這種情況下,緩存對齊不是問題。 – Neopallium 2010-11-01 10:34:16
感謝您的回覆。但是,有一件事我不明白這些與3個緩存行有什麼關係?應該有更多數量的緩存行。 – anup 2010-11-01 10:52:04