当数据隐藏在一个对象中时如何使用Intel预取指示pragma?

8
英特尔友善地提供了一个预取指示Pragma;例如:
#pragma prefetch a
for(i=0; i<m; i++)
  a[i]=b[i]+1;

将会预取一定数量的循环周期,由编译器确定,以提高性能。预取的是a数组。

但如果a不是一个数组,而是一个重载了[]运算符的类呢?如果operator[]只是简单地访问一个数组,那么预取还能这样使用吗?

(可以想象这个问题同样适用于std::vector。)

1个回答

2
一种找出答案的方法是尝试并查看汇编代码。如果有必要,可以使用基准测试来比较使用和不使用#pragma指令的性能差异。然而,我不确定预取指令是你想要的:
“预取指令仅受Intel® Itanium®处理器支持。”

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/cref_cls/common/cppref_pragma_prefetch_noprefetch.htm

“你真的是在为Itanium写这个代码吗?”
“在x86 / x64系统上,具有顺序内存访问的简单循环已经被硬件预取器很好地处理了。因此,手动预取可能没有任何帮助。”
“这里有一个预取示例:预取示例?

我正在为x86和Itanium编译代码,并假设任何关心性能的人都会在网格上使用后者。感谢指出硬件预取器的作用,我之前并没有意识到。 - Sideshow Bob
2018年,此编译指示仅适用于英特尔® MIC架构和英特尔® Advanced Vector Extensions 512(英特尔® AVX-512)。 - Olsonist
预取在x86上通常是有效的,但不适用于预取编译指示。请改用-qopt-prefetch标志。 - Olsonist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接