【问题标题】:Is the following code a valid OpenMP parallel program?以下代码是有效的 OpenMP 并行程序吗?
【发布时间】:2020-12-05 18:27:49
【问题描述】:

我现在正在准备考试,其中一个练习题是编写一段代码,该代码在 SMP 计算机上实现数组所有元素的并行求和。我之前写过一些 OpenMP 程序,它们很大,但没有真正利用子句和指令,我遇到了 reduce 子句,所以我想知道下面的部分是否是一个并行程序,因为我想知道如何是否可以将程序简化为但仍保留并行化?

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>


int main(int argc, char ** argv){

    int n = atoi(argv[1]);
    double * X;
    X = malloc(n * sizeof(double));
    for(int i = 0; i < n; i++){ X[i] = 2.0; }

    int i = 0;
    double sum = 0.0;

    omp_set_num_threads(atoi(argv[2]));

    #pragma omp parallel for private(i), shared(X) reduction(+: sum)
    for(i = 0; i < n; i++){
        sum += X[i];
    }

    printf("Sum is : %0.2f\n", sum);

    return 0;
}

【问题讨论】:

    标签: c multithreading parallel-processing openmp


    【解决方案1】:

    我遇到了减少条款,所以我想知道是否 下面是一个并行程序

    来自#pragma omp parallel 上的 OpenMP 标准:

    当一个线程遇到一个并行结构时,一组线程被 创建来执行并行区域。遇到的线程 并行构造成为新团队的主线程, 在新并行区域的持续时间内线程数为零。 新团队中的所有线程,包括主线程,都执行 地区。创建团队后,团队中的线程数 在该平行区域的持续时间内保持不变。

    所以是的,只要您在方法上明确设置的线程数,它就是一个并行程序:

    omp_set_num_threads(atoi(argv[2]));
    

    大于 1。

    在:

    #pragma omp parallel for private(i), shared(X) reduction(+: sum)
    

    私有i 可以省略,因为它在并行循环中用作index,OpenMP 会将其设为私有。

    【讨论】:

      【解决方案2】:

      为什么不直接运行它并进行测试。您也可以在笔记本电脑/台式机上运行类似的东西。 是的,此代码中的归约操作是并行的(求和计算)。 但是,将数组X 的元素设置为2.0 是顺序的。您可能需要#pragma omp parallel for 而不是for(int i = 0; i &lt; n; i++){ X[i] = 2.0; },以使程序真正并行。否则,将适用阿姆达尔定律。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-29
        • 2012-07-19
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 2021-12-09
        • 2015-03-06
        • 2011-07-20
        相关资源
        最近更新 更多