c++ - 与 OpenMP 的矩阵乘法不返回结果
问题描述
我是 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;
'''
解决方案
您需要更改数组的定义:
1-您可以将向量的向量用作:
#include <cstdlib>
#include <vector>
vector<vector<double>> a, b, mul;
2-使用评论中提到的动态分配数组。
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++ 中进行矩阵算术,将二维数组映射到一维数组上总是一个好主意,这里是一个讨论。
double* a = new double[n*n];
double* b = new double[n*n];
double* mul = new double[n*n];
推荐阅读
- javascript - 当我与比特币平均服务器通信时,它显示 403 状态代码错误
- html - 搜索框引导程序 4 无法定位在导航栏中的中间
- c - 针对 musl-gcc 编译 fio 的问题
- c# - Azure Batch - 资源文件准备任务
- css - 具有 3 个级别的 Bootstrap 4 菜单 - 第一个子菜单将无法选择
- javascript - 全部作为复选框
- c - 套接字 API:绑定错误:非套接字上的套接字操作
- python - 使用 Max 函数时,Set 和 List 有什么区别?
- sqlite - 如何在此代码中添加删除语句?
- android - 如何确认我的 AdMob 是否在使用测试广告(不是真实广告)?