我这样用它.
__pld(pin[0], pin[1], pin[2], pin[3], pin[4]);
Run Code Online (Sandbox Code Playgroud)
但是我得到了这个错误.
undefined reference to `__pld'
Run Code Online (Sandbox Code Playgroud)
我错过了什么?我是否需要包含头文件或其他内容?我正在使用ARM Cortex A8,它是否支持pld指令?
如本回答所示,您可以按照Clark使用内联汇编程序. __builtin_prefetch
也是一个很好的建议.要知道的一个重要事实是pld
指令如何作用于ARM; 对于某些处理器,它什么都不做 对于其他人,它将数据带入缓存.这仅对读操作(或读/修改/写)有效.另一件需要注意的是,如果它在您的处理器上运行,它会获取整个缓存行.因此,获取pin
数组的示例不需要指定所有成员.
通过确保pld
数据缓存对齐,您将获得更高的性能.另一个问题是,通过查看前面的代码,您只能获得您阅读的变量的性能.在某些情况下,您只是写入引脚阵列.预取这些项目没有任何价值.ARM具有写缓冲区,因此写入被批处理并自动突发到SDRAM芯片.
将所有读取数据分组在缓存线上将显示最大的性能改进; 整条线可以预先用一个pld
.此外,当您取消循环循环时,编译器将能够看到这些读取并在可能的情况下提前安排它们,以便它们填充到缓存中; 至少对于一些ARM cpu来说.
另外,你可以考虑,
__attribute__((optimize("prefetch-loop-arrays")))
Run Code Online (Sandbox Code Playgroud)
本着另一个问题的公认答案的精神; -O3
如果它对你指定的CPU有效,编译器可能已经启用了它.
可以指定各种编译器选项--param NAME=VALUE
,允许您在内存子系统上为编译器提供提示.如果您获得正确的参数,这可能是一个非常有效的组合.
prefetch-latency
simultaneous-prefetches
l1-cache-line-size
l1-cache-size
l2-cache-size
min-insn-to-prefetch-ratio
prefetch-min-insn-to-mem-ratio
确保-mcpu
为支持的编译器指定了一个pld
.如果一切正常,编译器应该自动为您执行此操作.但是,有时您可能需要手动执行此操作.
作为参考,这里是gcc-4.7.3的ARM prefetch loop arrays
代码激活.
/* Enable sw prefetching at -O3 for CPUS that have prefetch, and we have deemed
it beneficial (signified by setting num_prefetch_slots to 1 or more.) */
if (flag_prefetch_loop_arrays < 0
&& HAVE_prefetch
&& optimize >= 3
&& current_tune->num_prefetch_slots > 0)
flag_prefetch_loop_arrays = 1;
Run Code Online (Sandbox Code Playgroud)
尝试http://www.ethernut.de/en/documents/arm-inline-asm.html
在 GCC 中,它可能看起来像这样:
示例来自: http: //communities.mentor.com/community/cs/archives/arm-gnu/msg01553.html 和 pld 的用法:
__asm__ __volatile__(
"pld\t[%0]"
:
: "r" (first) );
Run Code Online (Sandbox Code Playgroud)