0
点赞
收藏
分享

微信扫一扫

C++ 并行加速

c一段旅程c 2022-04-16 阅读 164

一、OpenMP并行加速:

       在MIMD作为主要研究对象的系统中,分为两种类型:共享内存系统分布式内存系统,之前我们介绍的基于MPI方式的并行计算编程是属于分布式内存系统的方式,现在我们研究一种基于OpenMP的共享内存系统的并行编程方法。

VS配置进行OpenMP开发的步骤:

(1)在正式进行OpenMP编码之前,需要对编译器稍微配置一下。启动VS2015新建一个C++的控制台应用程序;

(2)然后在项目解决方案资源管理器上选择项目名称,点击右键,选择“属性”;

(3)然后在属性页上左侧选择“配置属性”——“C/C++”——“语言”,然后在右侧“OpenMP支持”后选择“是(/openmp)” ,这样就能在我们VS2015中进行OpenMP的程序开发了。

在程序中,为了能够使用OpenMP函数,还需要在程序包含omp.h头文件。

#include <omp.h>

当然也可以使用cmakelists文件进行配置。

但使用它有几天限制条件:

    (1)、OpenMP只能并行化for循环,它不会并行while和do-while循环,而且只能并行循环次数在for循环外面就确定了的for循环。

    (2)、循环变量只能是整型和指针类型(不能是浮点型)

    (3)、循环语句只能是单入口单出口的。循环内部不能改变index,而且里面不能有goto、break、return。但是可以使用continue,因为它并不会减少循环次数。另外exit语句也是可以用的,因为它的能力太大,他一来,程序就结束了。

1.1

#pragma omp parallel for

#pragma omp parallel for是OpenMP中的一个指令,表示接下来的for循环将被多线程执行,另外每次循环之间不能有关系, 如果使用这条简单的指令去运行并行计算的话,程序的线程数将由运行时系统决定(这里使用的算法十分复杂),典型的情况下,系统将在每一个核上运行一个线程。

1.2

如果需要执行使用多少个线程来执行我们的并行程序,就得为parallel指令增加num_threads子句,这样的话,就允许程序员指定执行后代码块的线程数。

#pragma omp parallel num_threads(thread_count)

1.3 

我们注意两个要点:

    (1)OpenMP编译器不检查被parallel for指令并行化的循环所包含的迭代间的依赖关系,而是由程序员来识别这些依赖关系。 

    (2)一个或更多个迭代结果依赖于其它迭代的循环,一般不能被OpenMP正确的并行化

当我们试图使用一个parallel for指令时,需要小心循环依赖关系,而不用担心数据依赖,缺省情况下,任何在循环前声明的变量,在线程间都是共享的。为了消除这种循环依赖关系之外,还需要保证每个线程有它自己的factor副本,OpenMP的语句为我们考虑了,通过添加private子句到parallel指令中来实现这一目标。 

void blog4::Test5(int argc, char* argv[])
{
    double factor = 1;
    double sum = 0.0;
    int n = 1000;
    int thread_count = strtol(argv[1], NULL, 10);//omp_get_num_threads();
    cout << thread_count << endl;
#pragma omp parallel for num_threads(thread_count) reduction(+:sum) private(factor)
    for (int i = 0; i < n; i++)
    {
        if (i % 2 == 0)
            factor = 1.0;
        else
            factor = -1.0;
        sum += factor / (2 * i + 1);
        //factor = -factor;
        //cout << i << "-" << factor << endl;
        //SumForNumber();
    }
    double pi_approx = 4.0*sum;
    printf("%f", pi_approx);
}

二、TBB并行加速

举报

相关推荐

0 条评论