首页 > 解决方案 > 在执行基本 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;
}

标签: copenmprace-condition

解决方案


首先,您正在执行的操作不能有数据竞争条件,因为没有 RAW 、 WAR 、 WAW 依赖。您可以在wiki中阅读有关它们的更多信息。

其次,您的系统挂起,因为您正在创建 750 个线程,如x_range


推荐阅读