问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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(单指令多数据)、循环并行和分治模式。通过具体的代码示例,帮助读者深入理解并行计算的基本原理和实践方法。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号