我在C中编写一个多线程程序,其中一个核心定期从链表头部抓取一个项目,而其他核心将项目附加到列表的后面(使用CAS魔术来保证线程安全,其他人提供了为了我)。看来我的程序运行得更快,如果核心从列表头部获取一个项目只是启动下一个项目的预取,这肯定是在另一个核心的缓存中。
目前我的目标是AMD Opteron 6168,在Debian Linux上使用gcc进行编译:我试图找到这方面的文档,但我在陌生的水域。我所能找到的只是使用-O3来启用编译器插入的预取(我认为是for循环),并提到了像PREFETCHW这样的AMD预取指令名称。
我不知道如何找到我所追求的参考,或者如何将这样的语句插入到C中,可能作为汇编块?
答案 0 :(得分:2)
检查英特尔架构文档。
在VC中,你应该可以做这样的事情
asm
{
prefetch POINTER_NAME
}
在GCC -
asm("prefetch %0", POINTER_NAME); //May have syntax slightly off
我以前看过这个。
答案 1 :(得分:2)
gcc附带了一些builtin functions。你可以做到
__builtin_prefetch(&yourData);