-qprefetch

适用的调用

表 1. 接受给定选项的调用
选项 xlc (编译 C) xlC (编译 C++) xlclang(编译 C) xlclang++(编译 C++)
-qprefetch
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表

类别

优化和调整

等效编译指示

无。

用途

自动在可以提高代码性能的位置插入预取指令。

-qprefetch 生效时,编译器可能会在已编译的代码中插入预取指令。 当 -qnoprefetch 生效时,预取指令不会插入编译代码中。

语法

读取语法图跳过可视语法图 -q prefetch:=noassistthreadassistthread=SMTCMP=noaggressiveaggressive=dscr=noprefetch

缺省值

-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 调用:
  1. 运行 -qpdf1=level=2
  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; 
}

相关信息