c - 以下代码是有效的 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;
}
解决方案
为什么不直接运行它并进行测试。您也可以在笔记本电脑/台式机上运行类似的东西。是的,此代码中的归约操作是并行的(求和计算)。但是,将数组元素设置X
为2.0
是顺序的。为了使程序真正并行,你会想要一个#pragma omp parallel for
over 。for(int i = 0; i < n; i++){ X[i] = 2.0; }
否则,将适用阿姆达尔定律。
推荐阅读
- css - 如何使用 CSS 和 Flexbox 调整剩余项目的大小
- javascript - React Redux with Persist - 部署新的迭代没有冲突
- azure-active-directory - AADSTS50013:断言签名验证失败。[原因 - 未找到密钥。客户端使用的密钥指纹:'xxxx'
- google-chrome - 在 puppeteer 中更新 Chrome 版本
- vb.net - 为什么需要在将数据表绑定到数据视图之前为其命名?
- python - 如何将我的数据集转换为 libsvm 以进行多标签分类并在 svmlight 中使用?
- node.js - 将 CSV 转换为 json 时编码不正确
- sql - 有显示输出百分比的 SQL 查询。但我无法理解输出
- django - Django:如何在新的数据库条目上刷新 html 内容
- php - 将 webpack devserver (HMR) 与使用虚拟主机运行的 PHP 项目连接