Oracle® Solaris Studio 12.4:使用 dbx 调试程序

退出打印视图

更新时间: 2015 年 1 月
 
 

编译器如何转换 OpenMP 代码

要更好地介绍 OpenMP 调试,有必要了解 OpenMP 代码是如何由编辑器进行转换的。参见下列 Fortran 示例:

1    program example
2        integer i, n
3        parameter (n = 1000000)
4        real sum, a(n)
5    
6        do i = 1, n
7        a(i) = i*i
8        end do
9    
10        sum = 0
11    
12    !$OMP PARALLEL DO DEFAULT(PRIVATE), SHARED(a, sum)
13    
14        do i = 1, n
15        sum = sum + a(i)
16        end do
17    
18    !$OMP END PARALLEL DO
19    
20        print*, sum
21        end program example

第 12 至 18 行的代码是一个并行区域。f95 编译器将这部分代码转换成从 OpenMP 运行时库中调用的外联子例程。此外联子例程有一个内部生成的名称,在本例中为 _ _$d1A12.MAIN_。然后,f95 编译器用一个 OpenMP 运行时库调用替换并行区域的代码,并将外联子例程作为其中一个参数进行传递。该 OpenMP 运行时库将处理线程相关的所有问题,并分配并行执行外联子例程的从属线程。C 编译器的工作原理与此相同。

调试 OpenMP 程序时,dbx 将外联子例程与其他任何函数一样对待,唯一的不同是您不能使用其内部生成的名称在该函数中显式设置断点。