【问题标题】:Matrix multiplication with OpenMP not return result与 OpenMP 的矩阵乘法不返回结果
【发布时间】:2021-11-14 16:22:42
【问题描述】:

我是 OpenMP 新手。我尝试创建 1000x1000 矩阵乘法并尝试使用 open mp 加速。但是当我执行我的代码时,它会通过而不会发生任何错误。但是当我运行执行代码时,它不会返回任何结果。我检查将尺寸更改为 10x10,然后立即生效!我不知道我的代码有什么问题。

#define n 1000 // Dimension of metrix

'''

int i, j, k, th_id, num_thread;
int max = 100;
double a[n][n], b[n][n], mul[n][n];
double norm;

srand(time(0));

double start = omp_get_wtime();
omp_set_num_threads(6);
#pragma omp parallel shared(a, b, mul, norm, num_thread) private(th_id, i, j, k)
{
    th_id = omp_get_thread_num();
    #pragma omp for
    for (i=0; i<n; i++){
        for (j=0; j<n; j++){
            a[i][j] = double(rand()%max)/100;
        }
    }
    #pragma omp for
    for (i=0; i<n; i++){
        for (j=0; j<n; j++){
            b[i][j] = double(rand()%max)/100;
        }
    }
    #pragma omp for
    for (i=0; i<n; i++){
        for (j=0; j<n; j++){
            mul[i][j] = 0;
        }
    }
    
    printf("Thread %d starting matrix multiply...\n", th_id);
    #pragma omp for
    for (i=0; i<n; i++) {
        printf("Thread = %d did row = %d\n", th_id, i);
        for (j=0; j<n; j++) {
            for (k=0; k<n; k++){
                mul[i][j] += a[i][k]*b[k][j]; 
            } 
        }
    }

    #pragma omp for reduction(+:norm)
    // Calculate Frobenius norm
    for (i=0; i<n; i++) {
        for (j=0; j<n; j++){
            norm += mul[i][j]*mul[i][j];
        }
    }
}
double end = omp_get_wtime();
printf("Frobenuis norm of parallel node is %lf\n", sqrt(norm));
printf("Elapsed time = %lf s\n", end-start);
printf("Precision = %lf s\n", omp_get_wtick());




printf("End Program");
return 0;

'''

【问题讨论】:

  • 你有堆栈溢出。 1000 * 1000 * sizeof(double)(对于 a 数组)太多,无法分配到堆栈上。将数组设为全局,或以动态方式分配它们,

标签: c++ openmp matrix-multiplication


【解决方案1】:

你需要改变数组的定义:

1- 你可以使用vector的向量作为:

#include <cstdlib>
#include <vector>

vector<vector<double>> a, b, mul; 

2- 使用 cmets 中提到的动态分配数组。

auto a = new double[n][n]; = new double[n][n];
auto b = new double[n][n];
auto mult = new double[n][n];

然后删除

delete[] a;
delete[] b;
delete[] mul;

3- 要在 C++ 中进行矩阵运算,最好将二维数组映射到一维数组here is a discussion

double* a = new double[n*n];
double* b = new double[n*n];
double* mul = new double[n*n];

【讨论】:

  • 您必须使用double(*a)[n]=new double[n][n];auto a = new double[n][n]; 而不是double** a = new double[n][n];
  • 你是对的!我改了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 2015-12-26
  • 2013-05-18
  • 1970-01-01
相关资源
最近更新 更多