📜  门| GATE CS 2018 |简体中文问题20(1)

📅  最后修改于: 2023-12-03 14:58:20.153000             🧑  作者: Mango

门 | GATE CS 2018 |简体中文问题20

本题是关于进行并行程序设计的问题。为了优化一个程序,程序员对其采用了并行计算的方法。

原始程序采用了三个循环嵌套。程序员通过观察代码发现其中可以进行并行处理的区域,并进行相应的代码修改,以达到优化程序的目的。修改后的程序如下:

 1: void P(int n, int m, float *a, float t) {
 2:     int i, j, k;
 3:     #pragma omp parallel for shared(a,n,m,t) private(i,j,k)
 4:     for (i=1; i < n-1; i++) {
 5:         for (j=1; j < m-1; j++) {
 6:             for (k=1; k < n-1; k++) {
 7:                 *(a+i*m+j) = (*(a+i*m+j)+*(a+i*m+j-1)+*(a+i*m+j+1)+
 8:                               *(a+(i-1)*m+j)+*(a+(i+1)*m+j)+
 9:                               *(a+(i-1)*m+j-1)+*(a+(i-1)*m+j+1)+
10:                               *(a+(i+1)*m+j-1)+*(a+(i+1)*m+j+1))/t;
11:                 }
12:             }
13:         }
14: }

程序员认为修改后的程序是对原始程序的一个优化。请问:

Q:此并行程序的正确输出是否与原程序相同?

A:不一定相同。

对于并行程序,输出是否正确与执行顺序和共享内存的使用有关。原始程序和并行程序在并行时共享内存已经是不同的,这可能会影响输出结果。在本例中,当 i,j 和 k 的枚举顺序发生更改时也会影响输出结果。因此,并行程序的输出与原始程序并不完全相同。