我目前是 OpenMp 的新手,正在尝试编写一个简单的 OpenMP-C 矩阵 vector 乘法程序。将矩阵大小增加到 750x750 元素后,我的程序停止响应并且窗口挂起。我想知道这是否是我的笔记本电脑的限制,或者是我面临的数据竞争状况。
我试图定义一个矩阵 A 和一个 vector u 并放入随机元素 (0-10)。然后我计算 vector 结果b。
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x_range = 50;
int y_range = 50;
int A[x_range][y_range];
int u[y_range];
int b[y_range];
printf("Measuring time resolution %g\n", omp_get_wtick());
printf("Parallel program start time %g\n", omp_get_wtime());
#pragma omp parallel num_threads(x_range)
{
int b_temp[y_range];
for (int j = 0; j < y_range; j++)
{
b_temp[j] = 0;
}
#pragma omp for
for (int i = 0; i < x_range; i++)
{
for (int j = 0; j < y_range; j++)
{
A[i][j] = (rand() % 10) + 1;
}
}
#pragma omp for
for (int j = 0; j < y_range; j++)
{
{
u[j] = (rand() % 10) + 1;
}
}
#pragma omp for
for (int i = 0; i < x_range; i++)
{
for(int j = 0; j < y_range; j++)
{
b_temp[i] = b_temp[i] + A[i][j]*u[j];
}
}
#pragma omp critical
for(int j = 0; j < y_range; j++)
{
b[j] = b[j] + b_temp[j];
}
}
printf("parallel program end time %g\n", omp_get_wtime());
return 0;
}
最佳答案
首先,您正在执行的操作不能有数据竞争条件,因为不存在 RAW 、 WAR 、 WAW 依赖性。您可以在 wiki 中阅读有关它们的更多信息。 .
其次,您的系统挂起是因为您按照 x_range
的指示创建了 750 个线程
关于c - 执行基本 OpenMP (C) 程序期间没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59592496/