-fdump-tree-all
您可以使用该选项查看中间树表示。鉴于该选项,GCC 在几个中间步骤写入一组文件,并且可以观察应用于树的连续转换。该.ompexp
文件在这里特别有趣,因为它包含在 OpenMP 表达式扩展为其具体实现之后的树。
例如parallel
下面简单代码中区域内的块:
int main (void)
{
int i = 0;
#pragma omp parallel
{
#pragma omp atomic
i++;
}
return i;
}
在 64 位 Linux 上由 GCC 4.7.2 转换为:
;; Function main._omp_fn.0 (main._omp_fn.0, funcdef_no=1, decl_uid=1712, cgraph_uid=1)
main._omp_fn.0 (struct .omp_data_s.0 * .omp_data_i)
{
int D.1726;
int D.1725;
int i [value-expr: *.omp_data_i->i];
int * D.1723;
int * D.1722;
<bb 2>:
D.1722_2 = .omp_data_i_1(D)->i;
D.1723_3 = &*D.1722_2;
__atomic_fetch_add_4 (D.1723_3, 1, 0);
return;
}
最终结束于:
00000000004006af <main._omp_fn.0>:
4006af: 55 push %rbp
4006b0: 48 89 e5 mov %rsp,%rbp
4006b3: 48 89 7d f8 mov %rdi,-0x8(%rbp)
4006b7: 48 8b 45 f8 mov -0x8(%rbp),%rax
4006bb: 48 8b 00 mov (%rax),%rax
4006be: f0 83 00 01 lock addl $0x1,(%rax)
4006c2: 5d pop %rbp
4006c3: c3 retq
至于第二个问题,可能还取决于 GCC 是如何构建的。