OpenMP并行编程设计模式总结:SPMD、循环并行与分治模式
创作时间:
作者:
@小白创作中心
OpenMP并行编程设计模式总结:SPMD、循环并行与分治模式
引用
CSDN
1.
https://m.blog.csdn.net/shimly123456/article/details/145539154
本文总结了OpenMP并行编程中的三种核心设计模式:SPMD(单指令多数据)、循环并行和分治模式。通过具体的代码示例,帮助读者深入理解并行计算的基本原理和实践方法。
新手并行程序员与专家并行程序员之间的区别在于,专家在脑海中拥有一系列基本的设计模式集合。以下是三种重要的并行设计模式:
SPMD(单指令多数据)
SPMD(Single Program Multiple Data)模式是指在P个处理单元上运行相同的程序,其中P可以是任意大的数值。使用rank(一个从0到P-1的ID)来选择任务集并管理任何共享数据结构。
例子:
#include "omp.h"
void main()
{
int i, step;
double pi = 0.0, sum = 0.0;
step = 1.0 / (double)num_steps;
#pragma omp parallel firstprivate(sum) private(x, i)
{
int id = omp_get_threads_num();
int numprocs = omp_get_num_threads();
int step1 = id * num_steps / numprocs;
int stepN = (id+1) * num_steps / numprocs;
if (id == numprocs - 1) {
stepN = num_steps;
}
for (ri = step1; i < stepN; i++) {
x = (i+0.5)*step;
sum += 4.0/(1.0+x*x);
}
#pragma omp critical
pi += sum*step;
}
}
循环并行
循环并行模式将任务集定义为一个或多个循环的迭代。循环迭代被分配给一组处理单元以并行计算任务。
例子:
void calc_pi_reduction()
{
static long num_steps = 0x20000000;
double step;
double sum = 0.0;
step = 1.0 / (double)num_steps;
double start = omp_get_wtime( );
#pragma omp parallel
#pragma omp for reduction(+:sum)
for (long i = 0; i < num_steps; i++) {
double x = (i + 0.5) * step;
sum += 4.0 / (1.0 + x * x);
}
double pi = sum * step;
double end = omp_get_wtime( );
printf("pi: %.16g in %.16g secs\n", pi, end - start);
}
分治模式
当问题可以分解成子问题,并且有将子问题的解重新组合为全局解的方法时,可以使用分治模式。通过定义一个分解操作,持续分解直到子问题小到可以直接求解,最后将子问题的解组合起来解决原始的全局问题。
例子:
#include "omp.h"
static long num_steps = 100000000;
#define MIN_BLK 10000000
double pi_comp(int Nstart, int Nfinish, double step)
{
int i, iblk;
double x, sum = 0.0, sum1, sum2;
if(Nfinish - Nstart < MIN_BLK) {
for(i = Nstart; i < Nfinish; i++) {
x = (i+0.5)*step;
sum += 4.0/(1.0+x*x);
}
} else {
iblk = Nfinish - Nstart;
#pragma omp task shared(sum1)
sum1 = pi_comp(Nstart, Nfinish - iblk/2, step);
#pragma omp task shared(sum2)
sum2 = pi_comp(Nfinish - iblk/2, Nfinish, step);
#pragma omp taskwait
sum = sum1 + sum2;
}
return sum;
}
int main()
{
int i;
double step, pi, sum;
step = 1.0 / (double)num_steps;
#pragma omp parallel
{
#pragma omp single
sum = pi_comp(0, num_steps, step);
}
pi = step * sum;
return 0;
}
本文总结了OpenMP并行编程中的三种核心设计模式:SPMD(单指令多数据)、循环并行和分治模式。通过具体的代码示例,帮助读者深入理解并行计算的基本原理和实践方法。
热门推荐
新高考背景下,什么是高中生生涯规划?为什么选科和选专业都必须先做好这步?
高中物理:那些你必须搞懂的典型电场等势面
方向盘跑偏时,应该做动平衡还是四轮定位?
车辆跑偏如何进行检测?怎样解决车辆跑偏问题?
盘点那些被读错的植物 | 薜荔VS芫荽:名字很高级,样子很普通!
芫荽和香菜的区别是什么?
计算机学什么专业比较好?这5个王牌方向,未来十年薪资翻倍不是梦!
年轻人通勤神器!10万级省油王+15万高性价比车型盘点
如何帮助青少年建立自我同一性?
石楠花的香味如何描述?
对ERP实施工作的理解:核心要点与实践指南
巴基斯坦经典美食:香料与风味的完美融合
团建如何介绍团队名称
紫薯如何看出是否坏了 吃了变质的紫薯怎么办
呼吸性碱中毒多人中招,该如何防治?
牙疼怎么办?16秒止疼法不存在,但这些缓解方法很实用
掌握六大茶的科学冲泡法及最佳饮用时机,提升品茗体验
中国科学家揭示多巴胺转运蛋白分子机制,为开发低成瘾性药物提供新思路
二战德国党卫军:纳粹的私人武装与国防军的差异
面对服务器CPU之争,英特尔决定将产品线一分为二
97岁老人髋部骨折,这个科室的医生用微创让老人“折”后重生
如何理解基金产品的收益波动?这些波动对长期投资有什么启示?
“北平方式”:和平解放的伟大创举
抵押融资是什么?一文读懂抵押融资的基本概念、流程与风险防范
开发商开具的销售不动产统一发票能否证明房产证的办理?
绿色防控:中国科学家发现让水稻广谱抗病更“皮实”的小分子
肠道内多发性息肉:危险性、诊断与生活管理全解析
幸福心理学5要素:PERMA模型详解
企业所得税汇缴申报:点点鼠标就完事?
樟脑丸几天就没毒性了?了解它的安全性与使用时长!