首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OMP:串行和并行版本的不同输出

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

Stack Overflow用户
提问于 2019-03-25 22:55:44
回答 1查看 131关注 0票数 0

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

我的并行代码是:

代码语言:javascript
复制
#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");

}

对于串行版本,我刚才评论了这一行:

代码语言:javascript
复制
#pragma omp for schedule (static, chunk)

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

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

******************************************************结果矩阵: 0.00 0.00

代码语言:javascript
复制
 0.00     1.00     2.00
代码语言:javascript
复制
 0.00     2.00     4.00   

******************************************************结果矩阵: 0.00 5.00 10.00

代码语言:javascript
复制
 0.00     8.00    16.00
代码语言:javascript
复制
 0.00    11.00    22.00

******************************************************完成。

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

用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

代码语言:javascript
复制
 0.00     1.00     2.00
代码语言:javascript
复制
 0.00     2.00     4.00   

******************************************************结果矩阵:0.0060.00 120.00

代码语言:javascript
复制
 0.00    96.00   192.00
代码语言:javascript
复制
 0.00   132.00   264.00

******************************************************完成。

我如何处理这个问题?

EN

回答 1

Stack Overflow用户

发布于 2019-03-25 23:02:08

我发现了错误。在串行版本中,我没有正确地进行评论。我忽略了这句话:

代码语言:javascript
复制
#pragma omp parallel shared(a,b,c,nthreads,chunk) private(tid,i,j,k)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55347539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档