2010-10-13 29 views
0

我在C中編寫了一個多線程程序,其中一個內核週期性地從鏈表的頭部抓取一個項目,而其他核心將項目附加到列表的後面(使用CAS魔術來實現線程安全,其他人則爲此提供了我)。看起來我的程序運行速度會更快,如果核心從列表頭開始預取下一個項目,肯定會在另一個核心的緩存中進行預取。如何預取C中的指針,以AMD Opteron 6168爲目標?

目前我的目標是使用Debian Linux上的gcc編譯AMD Opteron 6168:我試圖爲此找到文檔,但我處於陌生的水域。我所能找到的全部是使用-O3來啓用編譯器插入的預取(我認爲是循環),以及一些提到的AMD預取指令名稱,如PREFETCHW。

我不知道如何找到我之後的參考,或者如何將這樣的語句插入到C中,也許作爲一個程序集塊?

+0

你可以從頭部消耗並追加到尾部的鏈表被稱爲隊列......! – 2010-10-13 22:45:23

+0

爲什麼下一個項目* SURE *在另一個CPU緩存中?這可能是極有可能的,但是什麼*保證*這個? – 2010-10-13 22:46:30

回答

2

gcc自帶一些builtin functions。你可以做

__builtin_prefetch(&yourData); 
+0

哇,酷,這更好! – 2010-10-13 22:59:43

+0

哦,嘿,很酷! – 2010-10-14 01:31:42

2

檢查intel體系結構文檔。

在VC,你應該能夠做這樣的事

asm 
{ 
    prefetch POINTER_NAME 
} 

在GCC -

asm("prefetch %0", POINTER_NAME); //May have syntax slightly off 

我看了這在之前。

+0

GCC版本可能需要'asm volatile'(「prefetch%0」,:「r」POINTER_NAME);'這會將指針值加載到可用寄存器中,然後以該寄存器作爲其參數發出指令。程序集字符串是指令模板,%0被第0個參數替換。不過,我不是100%。 – nategoose 2010-10-13 22:11:22

+0

@nate:是的,我不會用我的gcc內聯語法發誓。它經常激怒我,並要求我查看手冊 - 任何一天都可以使用VS語法。 – 2010-10-13 22:14:22

+0

GCC語法允許通過優化來更好地處理內聯程序集,就像它自己生成的代碼一樣,但它並不直觀。 – nategoose 2010-10-13 22:26:18