【发布时间】: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。但是我在输出中看不到任何prfm或pld指令。你有什么建议吗? -
可能是“尝试更新的 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