在不同机器上具有不同输出的并行代码

奥斯卡·芬特姆(Oska Fentem)

当我在两台不同的机器上运行下面的代码时,我得到不同的输出,在一个输出中,输出是正确的(sum = sum2),在另一个输出中,输出不是正确的。

我不知道为什么

#include <stdio.h>
#include <math.h>
#include <omp.h>

int main(){

    const int NX=1000;    
    const int NY=1000;

    float x[NX+2];          
    float y[NX+2];          
    float u[NX+2][NY+2];    

    float x2;   // 
    float y2;
    float sum;
    float sum2;

    for (int i=0; i<NX+2; i++){
      for (int j=0; j<NY+2; j++){
        x2      = i;
        y2      = j;
        u[i][j] = x2+ y2;
        sum += u[i][j];
      }
    }
    for (int i=0; i<NX+2; i++){
      #pragma omp parallel for
      for (int j=0; j<NY+2; j++){
        x2      = i;
        y2      = j;
        u[i][j] = x2+ y2;
      }
    }

    for (int i=0; i<NX+2;i++){
      for (int j=0; j<NY+2; j++){
        sum2 += u[i][j];
      }
    }

    printf("%f \n", sum);
    printf("%f", sum2);
}
梦境崩溃

您需要初始化的值

float sum;
float sum2;

否则当操作:

sum += u[i][j];

sum2 += u[i][j];

导致不确定的行为这就是为什么您看到两个不同的结果。

将两个变量都设置为零:

float sum = 0;
float sum2 = 0;

使用(至少)标志-Wall编译代码。如果这样做,将会看到以下警告:

main.c:17:7: warning: 'sum2' may be used uninitialized in this function [-Wmaybe-uninitialized]
   17 | float sum2;
      |       ^~~~
main.c:16:7: warning: 'sum' may be used uninitialized in this function [-Wmaybe-uninitialized]
   16 | float sum;
      |       ^~~

性能方面,而不是并行化内部循环:

for (int i=0; i<NX+2; i++){
   #pragma omp parallel for
   for (int j=0; j<NY+2; j++){
      x2      = i;
      y2      = j;
      u[i][j] = x2+ y2;
    }
}

您应该通过使用OpenMP折叠选项来描述当同时使两个循环并行时发生的情况

#pragma omp parallel for collapse(2)
for (int i=0; i<NX+2; i++){       
   for (int j=0; j<NY+2; j++){
      u[i][j] = i + j;
    }
}

即使该collapse子句不是意见(例如,速度较慢),从性能角度来看,最好还是并行化外循环而不是内循环。首先,您避免了创建并行区域NX+2时间的开销其次,由于外部循环在列上进行迭代,内部循环在行上进行迭代,因此在线程之间划分第一个循环的迭代可减少错误共享的可能性

此外,您还可以并行化其他两个循环。但是,您将需要使用OpenMP减少子句来避免在sum和sum2变量更新期间出现竞争情况。

最终代码如下所示:

#include <stdio.h>
#include <math.h>
#include <omp.h>

int main(){

   const int NX=1000;    
   const int NY=1000;
   
   float u[NX+2][NY+2];    
   float sum = 0;
   float sum2 = 0;

   #pragma omp parallel for reduction(+:sum)
   for (int i=0; i<NX+2; i++){
     for (int j=0; j<NY+2; j++){
       sum += i+j;
     }
   }
   #pragma omp parallel for
   for (int i=0; i<NX+2; i++){
     for (int j=0; j<NY+2; j++){
        u[i][j] = i+j;
     }
   }

   #pragma omp parallel for reduction(+:sum2)
   for (int i=0; i<NX+2;i++){
     for (int j=0; j<NY+2; j++){
       sum2 += u[i][j];
     }
   }

   printf("%f \n", sum);
   printf("%f", sum2);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

不同机器python代码上的不同输出

来自分类Dev

不同网络上不同机器上的Python代码并行化

来自分类Dev

在具有相同代码的不同机器上,ProgressBar看起来有所不同

来自分类Dev

不同机器上的不同内核版本

来自分类Dev

在具有相同版本的XCode的不同机器上,自动布局的行为有所不同

来自分类Dev

不同机器上的DNS和DHCP

来自分类Dev

sklearn与statsmodels和sklearn在不同机器上的结果不同

来自分类Dev

EPPlus AutoFit()在不同机器上的不同列宽

来自分类Dev

使用Mercurial:如何记录不同机器上发生的源代码更改

来自分类Dev

Socket.Poll在不同机器上的延迟差异很大

来自分类Dev

不同机器上的RabbitMQ经纪人

来自分类Dev

不同机器上的C#内存泄漏

来自分类Dev

Socket.Poll在不同机器上的延迟差异很大

来自分类Dev

不同机器上的C#内存泄漏

来自分类Dev

在不同机器上编辑相同文件的建议

来自分类Dev

不同机器上的 strptime 不一致

来自分类Dev

我如何设置可以在不同机器上使用的 Jenkins?

来自分类Dev

来自不同机器的不同nmap结果?

来自分类Dev

连接在不同机器和不同网络上运行的两个不同的Ubuntu

来自分类Dev

在不同机器上绘制图元文件时的缩放比例不同

来自分类Dev

不同机器和操作系统上的应用程序行为不同

来自分类Dev

Keras > 在不同 Python 版本的不同机器上使用训练模型

来自分类Dev

如何在不编写丑陋代码的情况下,在具有不同机会的多个选项之间进行选择

来自分类Dev

来自不同机器的不同tmux会话列表?

来自分类Dev

单个静态IP后面的不同机器上的多个Web服务器

来自分类Dev

由于Java中的线程化,不同机器上的性能/时间问题

来自分类Dev

在不同机器上运行的服务器之间转发Thrift服务请求

来自分类Dev

Spring远程分区策略中如何在不同机器上启动slave

来自分类Dev

NS3 EMU可以在WAN中的不同机器上应用吗?

Related 相关文章

  1. 1

    不同机器python代码上的不同输出

  2. 2

    不同网络上不同机器上的Python代码并行化

  3. 3

    在具有相同代码的不同机器上,ProgressBar看起来有所不同

  4. 4

    不同机器上的不同内核版本

  5. 5

    在具有相同版本的XCode的不同机器上,自动布局的行为有所不同

  6. 6

    不同机器上的DNS和DHCP

  7. 7

    sklearn与statsmodels和sklearn在不同机器上的结果不同

  8. 8

    EPPlus AutoFit()在不同机器上的不同列宽

  9. 9

    使用Mercurial:如何记录不同机器上发生的源代码更改

  10. 10

    Socket.Poll在不同机器上的延迟差异很大

  11. 11

    不同机器上的RabbitMQ经纪人

  12. 12

    不同机器上的C#内存泄漏

  13. 13

    Socket.Poll在不同机器上的延迟差异很大

  14. 14

    不同机器上的C#内存泄漏

  15. 15

    在不同机器上编辑相同文件的建议

  16. 16

    不同机器上的 strptime 不一致

  17. 17

    我如何设置可以在不同机器上使用的 Jenkins?

  18. 18

    来自不同机器的不同nmap结果?

  19. 19

    连接在不同机器和不同网络上运行的两个不同的Ubuntu

  20. 20

    在不同机器上绘制图元文件时的缩放比例不同

  21. 21

    不同机器和操作系统上的应用程序行为不同

  22. 22

    Keras > 在不同 Python 版本的不同机器上使用训练模型

  23. 23

    如何在不编写丑陋代码的情况下,在具有不同机会的多个选项之间进行选择

  24. 24

    来自不同机器的不同tmux会话列表?

  25. 25

    单个静态IP后面的不同机器上的多个Web服务器

  26. 26

    由于Java中的线程化,不同机器上的性能/时间问题

  27. 27

    在不同机器上运行的服务器之间转发Thrift服务请求

  28. 28

    Spring远程分区策略中如何在不同机器上启动slave

  29. 29

    NS3 EMU可以在WAN中的不同机器上应用吗?

热门标签

归档