当前位置: 首页 > 知识库问答 >
问题:

OMP:串行和并行版本的不同输出

步博涉
2023-03-14

我正在尝试使用OMP运行矩阵乘法程序。我在串行和并行版本中得到了不同的输出。我正在尝试使用一个3*3矩阵进行测试

我的并行代码是:

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

#define NRA 3//62                 /* number of rows in matrix A */
#define NCA 3//15                 /* number of columns in matrix A */
#define NCB 3//7                  /* number of columns in matrix B */

int main (int argc, char *argv[]) 
{
int tid, nthreads, i, j, k, chunk;
double  a[NRA][NCA],           /* matrix A to be multiplied */
    b[NCA][NCB],           /* matrix B to be multiplied */
    c[NRA][NCB];           /* result matrix C */

chunk = 10;                    /* set loop iteration chunk size */

/*** Spawn a parallel region explicitly scoping all variables ***/
#pragma omp parallel shared(a,b,c,nthreads,chunk) private(tid,i,j,k)
  {
  tid = omp_get_thread_num();
  if (tid == 0)
    {
    nthreads = omp_get_num_threads();
    printf("Starting matrix multiple example with %d threads\n",nthreads);
    printf("Initializing matrices...\n");
    }
  /*** Initialize matrices ***/
  #pragma omp for schedule (static, chunk) 
  for (i=0; i<NRA; i++)
    for (j=0; j<NCA; j++)
      a[i][j]= i+j;
  #pragma omp for schedule (static, chunk)
  for (i=0; i<NCA; i++)
    for (j=0; j<NCB; j++)
      b[i][j]= i*j;
  #pragma omp for schedule (static, chunk)
  for (i=0; i<NRA; i++)
    for (j=0; j<NCB; j++)
      c[i][j]= 0;

  /*** Do matrix multiply sharing iterations on outer loop ***/
  /*** Display who does which iterations for demonstration purposes ***/
  printf("Thread %d starting matrix multiply...\n",tid);
  #pragma omp for schedule (static, chunk)
  for (i=0; i<NRA; i++)    
    {
    printf("Thread=%d did row=%d\n",tid,i);
    for(j=0; j<NCB; j++)       
      for (k=0; k<NCA; k++)
        c[i][j] += a[i][k] * b[k][j];
    }
  }   /*** End of parallel region ***/

/*** Print results ***/

printf("******************************************************\n");
printf("Result Matrix:\n");
for (i=0; i<NRA; i++)
  {
  for (j=0; j<NCB; j++) 
    printf("%6.2f   ", a[i][j]);
  printf("\n"); 
  }
printf("******************************************************\n");

printf("******************************************************\n");
printf("Result Matrix:\n");
for (i=0; i<NRA; i++)
  {
  for (j=0; j<NCB; j++) 
    printf("%6.2f   ", b[i][j]);
  printf("\n"); 
  }
printf("******************************************************\n");
printf("******************************************************\n");
printf("Result Matrix:\n");
for (i=0; i<NRA; i++)
  {
  for (j=0; j<NCB; j++) 
    printf("%6.2f   ", c[i][j]);
  printf("\n"); 
  }
printf("******************************************************\n");
printf ("Done.\n");

}

对于串行版本,我刚刚注释了该行:

#pragma omp for schedule (static, chunk)

我的并行版本的输出是:

起始矩阵 具有 12 个线程的多个示例初始化矩阵...线程 0 起始矩阵乘...线程 8 起始矩阵乘法...线程 6 起始矩阵乘...线程 9 起始矩阵乘法...线程 5 起始矩阵乘法...线程 1 起始矩阵乘...线程 4 起始矩阵乘...线程 7 起始矩阵乘法...线程 10 起始矩阵乘法...线程 3 起始矩阵乘法...线程 2 起始矩阵乘法...线程=0 行=0 线程=0 行=1 线程=0 行=2 线程 11 起始矩阵乘法... ******

******************************************************结果矩阵:0.00 0.00 0.00
0.00 1.00 2.00
0.00 2.00 4.00

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *结果矩阵:0.00 5.00 10.00 0.00 8.00 16.00 0 0.00 11.00 22.00 < br > * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *完成。

我的串行版本的输出如下:

用12个线程启动矩阵多重示例初始化矩阵...线程0开始矩阵乘法...线程3开始矩阵乘法...线程5开始矩阵乘法...线程11开始矩阵乘法...线程1开始矩阵乘法...线程10开始矩阵乘法...线程2开始矩阵乘法...线程9开始矩阵乘法...线程7开始矩阵乘法...线程8开始矩阵乘法...线程4开始矩阵乘法...线程6开始矩阵乘法...* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *结果矩阵:0.00 1.00 2.00 1.00 2.00 3.00 2.00 3.00 4.00

******************************************************结果矩阵:0.00 0.00 0.00
0.00 1.00 2.00
0.00 2.00 4.00

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *结果矩阵:0.00 60.00 120.00 0.00 96.00 192.00 0 0.00 132.00 264.00 132.00 132.00 132.00 132.00 132.00 132.00 132.00 132.00 132。

我如何处理这个问题?

共有1个答案

宓英哲
2023-03-14

我发现了错误。在连载版中,我没有正确评论。我忽略了这句台词:

#pragma omp parallel shared(a,b,c,nthreads,chunk) private(tid,i,j,k)
 类似资料:
  • 本文向大家介绍串行和并行传输之间的区别,包括了串行和并行传输之间的区别的使用技巧和注意事项,需要的朋友参考一下 众所周知,当计算机/笔记本电脑之间进行数据传输时,可能会有两种类型的数据传输,即串行或并行。根据这两种传输方式的不同特征,我们可以对其进行区分。 以下是串行传输和并行传输之间的重要区别- 序号 键 串行传输 平行传输 1 定义 串行传输是一种传输类型,其中单个通信链路用于将数据从一端传输

  • 今天我和jenv一起玩,将Java1.8设置为全局版本,将1.7设置为本地项目。此后,mvn命令在全局位置显示为java版本12- 而Java版本显示如预期- 我试图卸载和安装maven通过sdkman再次,在Mac上。虽然它没有新鲜下载。我仍然得到同样的错误。 我该怎么解决这个问题?

  • 问题内容: 我们将更新创建从Java 7到Java 8的构建的CI系统。稍后,我们希望将项目一个接一个地迁移到Java 8。当然,我们希望能够为仍使用Java 7的旧版本创建错误修正版本。 如果我们将构建相同的源,目标版本和源版本从JDK 7转移到JDK 8,我们是否可以确定不会出现任何问题?我们在开发机器上进行了测试,没有任何问题。 在此之前,我们还将逐步将部署服务器从JRE 7更新到JRE 8

  • 首先也是最重要的是,我对Java知之甚少,对SWT更是知之甚少,所以我就到此为止。今天早些时候,我试着运行我在上找到的这个简单程序https://mkyong.com/swt/swt-hello-world-example 以下是代码: 当我运行它时,会出现以下错误: 我从中了解到的是,SWT正在用Java11编译,而它应该用Java8编译,但是——这是一个很大的BUT——我没有Java11我删除

  • 我有一个关于平行编程的学校任务,我遇到了很多问题。我的任务是创建给定矩阵乘法代码的并行版本并测试其性能(是的,它必须按 KIJ 顺序): 这是我到目前为止想出的: 这就是我发现一些让我感到困惑的地方。这个并行版本的代码运行速度比非并行版本慢约 50%。速度的差异仅根据矩阵大小而略有变化(测试SIZE = 128,256,512,1024,2048和各种计划版本 - 动态,静态,到目前为止根本没有它

  • 问题内容: 我们正在使用JBoss 4.2.3,该版本又带有Hibernate的3.2.1.ga版本。我想使用支持JPA 2.0的Hibernate 3.5.1-FINAL。我一直在尝试通过将自己的hibernatejar放入WEB-INF / lib文件夹并在jboss- web.xml中为WAR创建自己的类加载器来使其工作 我也尝试过: 但是我遇到了很多问题,这是我目前坚持的例外情况: 由于最