【问题标题】:Not responding during exeuting basic OpenMP (C) program在执行基本 OpenMP (C) 程序期间没有响应
【发布时间】:2020-01-04 16:12:45
【问题描述】:

我目前是 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;
}

【问题讨论】:

    标签: c openmp race-condition


    【解决方案1】:

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

    其次,您的系统挂起,因为您按照x_range 的指示创建了 750 个线程

    【讨论】:

    • 是的,没错。我尝试设置 num_threads = 10 并遇到了同样的问题。你能建议我可以研究的任何其他方法吗?
    • 如果您将#pragma omp critical 更改为#pragma omp for,它是否仍然挂起?
    • 是的,我改变了它,窗口挂起。我尝试了 10 个线程的静态调度,但同样的问题。 #pragma omp for schedule(静态,10)
    • 碰巧,您是在 VirtualBox 或 VMWare Player 等虚拟环境中进行的吗?
    猜你喜欢
    • 2021-12-17
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    相关资源
    最近更新 更多