c - 执行基本 OpenMP (C) 程序期间没有响应

标签 c openmp race-condition

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

相关文章:

c++ - 头文件中的源代码

c - 如何为 C 程序计时

c - OpenMP 与节的嵌套并行性

c++ - 使用 OpenMP 在 odeint 中创建受控步进器

java - 怎么可能有竞争条件呢?

c - kill - 它会立即终止进程吗?

c - 并行使用 pragma 进行构造

java - JFreeChart addBin 具有竞争条件?

objective-c - KIF:如何自动运行/压力测试 iOS 应用程序以找出罕见的 UI 错误的原因?

c - 为什么当unsigned long可用时我们需要uint64_t?