-qprefetch
适用的调用
| 选项 | xlc (编译 C) | xlC (编译 C++) | xlclang(编译 C) | xlclang++(编译 C++) |
|---|---|---|---|---|
| -qprefetch | ✓ | ✓ | ✓ | ✓ |
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表 。
类别
等效编译指示
无。
用途
自动在可以提高代码性能的位置插入预取指令。
当 -qprefetch 生效时,编译器可能会在已编译的代码中插入预取指令。 当 -qnoprefetch 生效时,预取指令不会插入编译代码中。
语法
缺省值
-qprefetch=noassistthread:noaggressive:dscr=0
参数
- assistthread | noassistthread
- 当使用生成高速缓存不命中率高的应用程序时,可使用
-qprefetch=assistthread 来利用辅助线程以进行数据预取。 此子选项指导编译器在优化级别 -O3 -qhot 或更高级别利用辅助线程。 如果未指定 -qprefetch=assistthread,那么将隐含 -qprefetch=noassistthread。
- CMP
- 对于基于芯片多处理器体系结构 (CMP) 的系统,可以使用 -qprefetch=assistthread=cmp。
- SMT
- 对于基于同时多线程体系结构 (SMT) 的系统,可以使用 -qprefetch=assistthread=smt。注: 如果未指定 CMP 或 SMT ,那么编译器将根据系统体系结构使用缺省设置。
- aggressive | noaggressive
- 此子选项指导编译器在优化级别 -O3 或更高级别生成主动数据预取。 如果未指定 aggressive,那么将隐含 -qprefetch=noaggressive。
- dscr
- 您可以为
dscr子选项指定值以提高应用程序的运行时性能。 编译器将数据流控制寄存器 (DSCR) 设置为指定的值以控制硬件预取引擎。 对于 POWER8 处理器或更高版本 ,该值仅在优化级别为-O2或更高;对于 POWER5、 POWER6 和 POWER7 处理器,仅当优化级别为-O3或更大,且高阶变换(HOT)有效。dscr的缺省值为 0。- value
为
dscr指定的值必须为 0 或更大,并且可表示为 64 位无符号整数。 否则,编译器将发出警告消息并将dscr设置为 0。 编译器接受十进制和十六进制数字,并且十六进制数字需要前缀0x。 值范围取决于系统体系结构。 请参阅有关 POWER ® 架构的产品信息以获取详细信息。 如果指定多个值,那么最后一个值生效。
使用量
-qnoprefetch 选项不会阻止内置函数(例如 __prefetch_by_stream)生成预取指令。
运行 -qprefetch=assistthread时,编译器将使用不良装入信息来执行分析并生成预取辅助线程。 拖欠的装入信息可以通过内置 __mem_delay 函数 (const void * de签发 int load_address , const unsigned int delay_cycle)提供,也可以使用 -qpdf1=level=2从动态概要分析收集。
使用 -qpdf 调用 -qprefetch=assistthread 时,必须使用传统的两步 PDF 调用:
- 运行 -qpdf1=level=2
- 运行 -qpdf2 -qprefetch=assistthread
示例
以下是使用 __MEM_DELAY的辅助线程生成代码的方式:
初始代码:
int y[64], x[1089], w[1024];
void foo(void){
int i, j;
for (i = 0; i &l; 64; i++) {
for (j = 0; j < 1024; j++) {
/* what to prefetch? y[i]; inserted by the user */
__mem_delay(&y[i], 10);
y[i] = y[i] + x[i + j] * w[j];
x[i + j + 1] = y[i] * 2;
}
}
}辅助线程生成的代码:
void foo@clone(unsigned thread_id, unsigned version)
{ if (!1) goto lab_1;
/* version control to synchronize assist and main thread */
if (version == @2version0) goto lab_5;
goto lab_1;
lab_5:
@CIV1 = 0;
do { /* id=1 guarded */ /* ~2 */
if (!1) goto lab_3;
@CIV0 = 0;
do { /* id=2 guarded */ /* ~4 */
/* region = 0 */
/* __dcbt call generated to prefetch y[i] access */
__dcbt(((char *)&y + (4)*(@CIV1)))
@CIV0 = @CIV0 + 1;
} while ((unsigned) @CIV0 < 1024u); /* ~4 */
lab_3:
@CIV1 = @CIV1 + 1;
} while ((unsigned) @CIV1 < 64u); /* ~2 */
lab_1:
return;
}