c - 在执行基本 OpenMP (C) 程序期间没有响应
问题描述
我目前是 OpenMp 的新手,正在尝试编写一个简单的 OpenMP-C 矩阵向量乘法程序。将矩阵大小增加到 750x750 元素时,我的程序停止响应并且窗口挂起。我想知道这是我的笔记本电脑的限制,还是我面临的数据竞争状况。
我正在尝试定义一个矩阵 A 和一个向量 u 并放置随机元素(0-10)。然后我正在计算向量结果 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中阅读有关它们的更多信息。
其次,您的系统挂起,因为您正在创建 750 个线程,如x_range
推荐阅读
- java - Launch4j-FakeMain 由更新版本的 Java Runtime(类文件版本 55 0)编译,此 Java Runtime 仅识别高达 52 0 的类文件版本
- javascript - 如何使用 node-cron 执行自动功能
- python - 创建一个玩具 3D 数组包含每小时频率、温度和纬度、经度坐标
- python - 是否有任何用于在不同范数的向量空间之间转换坐标的python算法?
- c# - 如何从 %appdata% 邮寄文件
- sql - 如何在 SQLite 中对 Quarters 中的日期进行分组
- recursion - Church Turing Thesis 是否保证递归代码可以作为迭代实现来实现?
- python-3.x - Python:将输出导出到 Google 表格
- python - 如何让输入字段出现在 JupyterLab 中?
- python-3.x - 需要 Python 正则表达式替换帮助