首页 > 解决方案 > 以下代码是有效的 OpenMP 并行程序吗?

问题描述

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

#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;
}

标签: cmultithreadingparallel-processingopenmp

解决方案


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


推荐阅读