如何在ARM中使用pld指令

Met*_*est 4 c gcc arm

我这样用它.

__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指令?

art*_*ise 6

本回答所示,您可以按照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)


Pro*_*ica 4

尝试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)