OpenMP pragma 转换为运行时调用
OpenMP pragma translation to runtime calls
我用 C 语言用 OpenMP pragma 编写了一个简短的程序,我需要知道 GCC 将 pragma 翻译成哪个 libGOMP 函数。
这是我的绝妙代码:
#include <stdio.h>
#include "omp.h"
int main(int argc, char** argv)
{
int k = 0;
#pragma omp parallel private(k) num_threads(4)
{
k = omp_get_thread_num();
printf("Hello World from %d !\n", k);
}
return 0;
}
为了从 GCC v8.2.0 生成中间语言,我使用以下命令编译了这个程序:
gcc -fopenmp -o hello.exe hello.c -fdump-tree-ompexp
结果为:
;; Function main (main, funcdef_no=0, decl_uid=2694, cgraph_uid=0, symbol_order=0)
OMP region tree
bb 2: gimple_omp_parallel
bb 3: GIMPLE_OMP_RETURN
Added new low gimple function main._omp_fn.0 to callgraph
Introduced new external node (omp_get_thread_num/2).
Introduced new external node (printf/3).
;; Function main._omp_fn.0 (main._omp_fn.0, funcdef_no=1, decl_uid=2700, cgraph_uid=1, symbol_order=1)
main._omp_fn.0 (void * .omp_data_i)
{
int k;
<bb 6> :
<bb 3> :
k = omp_get_thread_num ();
printf ("Hello World from %d !\n", k);
return;
}
;; Function main (main, funcdef_no=0, decl_uid=2694, cgraph_uid=0, symbol_order=0)
Merging blocks 2 and 7
Merging blocks 2 and 4
main (int argc, char * * argv)
{
int k;
int D.2698;
<bb 2> :
k = 0;
__builtin_GOMP_parallel (main._omp_fn.0, 0B, 4, 0);
D.2698 = 0;
<bb 3> :
<L0>:
return D.2698;
}
对“__builtin_GOMP_parallel”的函数调用是我感兴趣的地方。所以,我查看了来自 GCC 的 libGOMP 的源代码。
但是,我发现的唯一函数调用是(来自 parallel.c 文件):
GOMP_parallel_start (void (*fn) (void *), void *data, unsigned num_threads)
GOMP_parallel_end (void)
所以,我可以想象,以某种方式,对“__builtin_GOMP_parallel”的调用被转换为GOMP_parallel_start和GOMP_parallel_end。
我怎样才能确定这个假设?如何找到从内置函数到我在源代码中找到的另外两个函数的翻译?
谢谢
你快明白了。 __builtin_GOMP_parallel
只是 GOMP_parallel
的编译器别名(在 omp-builtins.def 中定义),它在编译的很晚才被翻译,您可以在 gcc -S
的程序集中看到实际调用。
GOMP_parallel
类似于
GOMP_parallel_start(...);
fn(...);
GOMP_parallel_end();
我用 C 语言用 OpenMP pragma 编写了一个简短的程序,我需要知道 GCC 将 pragma 翻译成哪个 libGOMP 函数。 这是我的绝妙代码:
#include <stdio.h>
#include "omp.h"
int main(int argc, char** argv)
{
int k = 0;
#pragma omp parallel private(k) num_threads(4)
{
k = omp_get_thread_num();
printf("Hello World from %d !\n", k);
}
return 0;
}
为了从 GCC v8.2.0 生成中间语言,我使用以下命令编译了这个程序:
gcc -fopenmp -o hello.exe hello.c -fdump-tree-ompexp
结果为:
;; Function main (main, funcdef_no=0, decl_uid=2694, cgraph_uid=0, symbol_order=0)
OMP region tree
bb 2: gimple_omp_parallel
bb 3: GIMPLE_OMP_RETURN
Added new low gimple function main._omp_fn.0 to callgraph
Introduced new external node (omp_get_thread_num/2).
Introduced new external node (printf/3).
;; Function main._omp_fn.0 (main._omp_fn.0, funcdef_no=1, decl_uid=2700, cgraph_uid=1, symbol_order=1)
main._omp_fn.0 (void * .omp_data_i)
{
int k;
<bb 6> :
<bb 3> :
k = omp_get_thread_num ();
printf ("Hello World from %d !\n", k);
return;
}
;; Function main (main, funcdef_no=0, decl_uid=2694, cgraph_uid=0, symbol_order=0)
Merging blocks 2 and 7
Merging blocks 2 and 4
main (int argc, char * * argv)
{
int k;
int D.2698;
<bb 2> :
k = 0;
__builtin_GOMP_parallel (main._omp_fn.0, 0B, 4, 0);
D.2698 = 0;
<bb 3> :
<L0>:
return D.2698;
}
对“__builtin_GOMP_parallel”的函数调用是我感兴趣的地方。所以,我查看了来自 GCC 的 libGOMP 的源代码。 但是,我发现的唯一函数调用是(来自 parallel.c 文件):
GOMP_parallel_start (void (*fn) (void *), void *data, unsigned num_threads)
GOMP_parallel_end (void)
所以,我可以想象,以某种方式,对“__builtin_GOMP_parallel”的调用被转换为GOMP_parallel_start和GOMP_parallel_end。 我怎样才能确定这个假设?如何找到从内置函数到我在源代码中找到的另外两个函数的翻译?
谢谢
你快明白了。 __builtin_GOMP_parallel
只是 GOMP_parallel
的编译器别名(在 omp-builtins.def 中定义),它在编译的很晚才被翻译,您可以在 gcc -S
的程序集中看到实际调用。
GOMP_parallel
类似于
GOMP_parallel_start(...);
fn(...);
GOMP_parallel_end();