如何在C语言中预取指针,以AMD Opteron 6168为目标?

如何在C语言中预取指针,以AMD Opteron 6168为目标?,c,prefetch,amd-processor,C,Prefetch,Amd Processor,我正在用C编写一个多线程程序,其中一个内核周期性地从链表的开头抓取一个项目,而其他内核将项目附加到列表的后面(使用CAS magic实现线程安全,其他人为我提供了这一点)。如果核心从列表的头部获取一个项目,并简单地启动下一个项目的预取,那么我的程序将运行得更快,而下一个项目肯定位于另一个核心的缓存中 目前我的目标是AMD Opteron 6168,在Debian Linux上使用gcc进行编译:我试图找到这方面的文档,但我并不熟悉。我所能找到的就是使用-O3来启用编译器插入的预取(我认为是循环)

我正在用C编写一个多线程程序,其中一个内核周期性地从链表的开头抓取一个项目,而其他内核将项目附加到列表的后面(使用CAS magic实现线程安全,其他人为我提供了这一点)。如果核心从列表的头部获取一个项目,并简单地启动下一个项目的预取,那么我的程序将运行得更快,而下一个项目肯定位于另一个核心的缓存中

目前我的目标是AMD Opteron 6168,在Debian Linux上使用gcc进行编译:我试图找到这方面的文档,但我并不熟悉。我所能找到的就是使用-O3来启用编译器插入的预取(我认为是循环)以及一些提到AMD预取指令名的地方,比如PREFETCHW


我不知道如何找到我要找的内容的引用,或者如何在C中插入这样的语句,可能是作为程序集块?

查看英特尔体系结构文档

在VC中,你应该能够做这样的事情

asm
{
  prefetch POINTER_NAME
}
在GCC中-

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

我以前已经看过了。

查看英特尔体系结构文档

在VC中,你应该能够做这样的事情

asm
{
  prefetch POINTER_NAME
}
在GCC中-

asm("prefetch %0", POINTER_NAME); //May have syntax slightly off
我以前已经看过了。

gcc附带了一些。你能行

__builtin_prefetch(&yourData);
gcc为此提供了一些支持。你能行

__builtin_prefetch(&yourData);

GCC版本可能需要
asm volatile(“预回迁%0”,“r”指针\u名称)这将把指针值加载到一个可用的寄存器中,然后以该寄存器作为参数发出指令。程序集字符串是指令模板,%0将替换为第0个参数。不过,我并不是100%同意这一点。@nate:是的,我并不是在咒骂我的gcc内联语法。它经常激怒我,并要求我每天查找手册-gimme VS syntax。GCC语法允许优化过程将内联程序集处理得更像它自己生成的代码,但这一点也不直观。您的回答让我找到了一段Linux内核代码,它演示了我正在寻找的语法,感谢您的帮助静态内联void prefetch(void*x){asm volatile(“prefetcht0%0”):“m”(*(unsigned long*)x));}GCC版本可能需要
asm volatile(“prefetch%0”,:“r”指针(名称)这将把指针值加载到一个可用的寄存器中,然后以该寄存器作为参数发出指令。程序集字符串是指令模板,%0将替换为第0个参数。不过,我并不是100%同意这一点。@nate:是的,我并不是在咒骂我的gcc内联语法。它经常激怒我,并要求我每天查找手册-gimme VS syntax。GCC语法允许优化过程将内联程序集处理得更像它自己生成的代码,但这一点也不直观。您的回答让我找到了一段Linux内核代码,它演示了我正在寻找的语法,感谢您的帮助静态内联void prefetch(void*x){asm volatile(“prefetcht0%0”::“m”(*(unsigned long*)x));}一个链接列表,您可以从头部消费并附加到尾部,称为队列。。。!为什么下一个项目肯定在另一个CPU缓存中?这可能是极有可能的,但什么能保证这一点呢?一个可以从头部消费并附加到尾部的链表被称为队列。。。!为什么下一个项目肯定在另一个CPU缓存中?这可能极有可能,但什么能保证这一点呢?