【问题标题】:Add prefetch capability to target of arm-linux-gnueabi-g++为 arm-linux-gnueabi-g++ 的目标添加预取功能
【发布时间】:2016-05-11 05:41:56
【问题描述】:

以下代码行已在 Ubuntu 主机上使用 arm-linux-gnueabi-g++-4.7 进行了交叉编译。 prfm 指令本应为特定行生成,但事实并非如此。

__builtin_prefetch(&some_variable,0,3); 

编译命令为:

arm-linux-gnueabi-g++-4.7 -O0 -S -std=c++11 main.cpp -D some_definition 
cat main.s | grep pr
//Returns null (main.s is all lower case)

这里引用gcc reference中的一行与问题有关:

如果目标不支持数据预取,如果地址表达式包含副作用但不生成其他代码且 GCC 不发出警告,则计算地址表达式。

最后一条信息是交叉编译器是使用apt-get install安装的,而不是从头开始。

问题来了:

如何简单地将数据预取支持添加到arm-linux-gnueabi-g++-4.7 交叉编译器的目标中?

提前致谢

【问题讨论】:

  • 修改 GCC 的内部目标以适应它们不支持的指令是很疯狂的,只需为 right 目标进行编译(即适当地使用-march)。其次,在 32 位上,指令是 pld,而不是 prfm
  • 感谢@Notlikethat 将架构设置为 armv7-a 可以解决此问题。
  • 嗨@Notlikethat,现在我需要为 64 位架构做同样的事情。我正在使用aarch64-linux-gnu-g++-4.8 -O3 -std=c++11 -static -S -march=armv8-a main.cpp。但是我在输出中看不到任何 prfmpld 指令。你有什么建议吗?
  • 可能是“尝试更新的 GCC,但不要抱太大希望”。我对 AArch64 后端可能没有实现__builtin_prefetch(或者至少在 4.8 中没有)并不感到惊讶。几乎所有支持 AArch64 的 CPU 都具有有效的硬件预取器 - 在大多数情况下,手动预取指令实际上会降低性能 - 一个值得注意的例外是 Cavium ThunderX,它仅受 GCC 5+ 支持。
  • @Notlikethat 感谢您的提示。我基于 GCC 5.4.0 构建了另一个交叉编译器。现在我可以在汇编文件中看到prfm PLDL1KEEP, [x1] 行。为了将来参考,这里是构建交叉编译器的脚本:gist.github.com/agyaglikci/35e925af9e608f2dd3fd079818d24968

标签: arm cross-compiling prefetch g++-4.7 gem5


【解决方案1】:

正如@Notlikethat 所建议的那样,使用-march=armv7-a 进行编译解决了这个问题。现在汇编输出中有一条 pld 指令。

$ arm-linux-gnueabi-g++-4.7 -g -O3 -std=c++11 -static -S -march=armv7-a main.cpp -D some_definition
$ cat main.s | grep pld
pld [r0, #0]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多