精华内容
下载资源
问答
  • C/C++多线程并行编程
    2021-06-01 10:53:36

    需要引入thread库

    创建线程:

    thread thr = thread(fun_name, argvs());//参数列表
    

    当线程被创建以后,就会自动开始执行线程函数fun_name,函数的参数中如果有引用,需要用ref()函数,不能用&符号

    创建线程数组:

    thread* th = new thread[thr_num]; //新建一个线程数组
    for(int i=0;i<thr_num;i++){
    	//对每个线程进行初始化
    	th[i] = thread(函数名称, 参数列表);
    }
    //线程完成时,需要等待线程结束,可使用join或者detach
     for (int i = 0; i < actThr_num; i++)
            th[i].join();//等待子线程结束
    

    当thread::join()函数被调用后,调用它的线程会被block,直到线程的执行被完成。基本上,这是一种可以用来知道一个线程已结束的机制。当thread::join()返回时,OS的执行的线程已经完成,C++线程对象可以被销毁。

    当thread::detach()函数被调用后,执行的线程从线程对象中被分离,已不再被一个线程对象所表达–这是两个独立的事情。C++线程对象可以被销毁,同时OS执行的线程可以继续。如果程序想要知道执行的线程何时结束,就需要一些其它的机制。join()函数在那个thread对象上不能再被调用,因为它已经不再和一个执行的线程相关联。

    更多相关内容
  • C++并行编程

    2017-06-08 20:32:55
    深入理解计算机系统中并行编程部分
  • 中文文字版,字迹清晰,很不错的多线程编程的书籍
  • Visual C++并行编程实战

    2017-05-03 13:33:00
    mobi版的,方便推送到kindle上进行阅读,经过简单的转换也可以转换成其他版本
  • C++ Concurrency In Action的中文翻译,称作C++并行编程实践,基于c++11新标准的并发和多线程编程指南。
  • c++并行编程》是中文版的名字,原名为"C++ Concurrency in Action",第一本讲述c++ 11标准中多线程并行编程的书籍,作者又是boost库多线程的重要贡献者,C++11的多线程标准大多来自于boost库,因此,此书具有很高的...
  • C++并行编程实战

    2018-09-24 22:09:31
    C++并行编程实战,英文版,重点讲解C++ 2011里面的thread mutex lock,原子类型等等
  • c++ 并行编程

    万次阅读 2017-05-02 17:30:52
    本博客将看C++并行编程的例子 首先看如何看 #include #include using namespace std; int main() { clock_t startTime,endTime; startTime = clock(); for (int i = 0; i ; i++) { i++; }

    本博客将看C++并行编程的例子

    1. 线程进程原理

    线程是轻量级的进程,一个进程可以拥有多个线程。

    编译多线程程序加入 <pthread.h> 

    g++ -lphread

    2. openmp库加速

    2.1 openmp库加速配置及hello,world

    事实上有个openmp库,可以实现单台cpu的加速

    Windows下使用vs
    Configuration Properties->C/C++->Language->OpenMP Support,在下拉菜单里选择Yes。然后才能使用OpenMP
    并行代码为例,只需要把相应的行注释掉,就是串行代码了
    默认情况下,并行区内线程数=系统中核的个数

    在Linux下使用g++即可

    #include <stdio.h>
    #include "omp.h"
    int main()
    {
      #pragma omp parallel
      printf( "Hello world!\n" );
      return 0;
    }

    g++ test.cpp
    ./a.out
    输出一个
    g++ -fopenmp  test.cpp
    ./a.out
    输出12个,默认为cpu的逻辑核数(=cpu块数*cpu物理核数*(开启超线程*2))
    export OMP_NUM_THREADS=6
    ./a.out
    输出6个

    一旦采用了OpenMP,线程数量就将由编译器来决定(而不是您),因此无论线程数量如何,重要的是使程序能够正常运行

    2. 实战测试

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    
    //一个简单的耗时任务
    double Sum0(double* data,long data_count);
    
    int main()
    {
        long data_count=200000;
        double* data=new double[data_count];
        long i;
    
        //初始化测试数据 
        for (i=0;i<data_count;++i)
            data[i]=(double)(rand()*(1.0/RAND_MAX));
    
        const long test_count=200*2;//为了能够测量出代码执行的时间,让函数执行多次
        double sumresult=0;
        double runtime=(double)clock();
        for( i=0; i<test_count; ++i ) 
        {
            sumresult+=Sum0(data,data_count);
        }
        runtime=((double)clock()-runtime)/CLOCKS_PER_SEC;
        printf ("< Sum0 >  ");
        printf ("  最后结果     = %10.4f  ",sumresult);
        printf ("  执行时间(秒) = %f  ",runtime);
    
        delete [] data;
        return 0;
    }
    
    
    double Sum0(double* data,long data_count)
    {
        double result=0;
        #pragma omp parallel for schedule(static) reduction(+: result)
        for (long i=0;i<data_count;++i)
        {
            data[i]=(double)sin(cos(data[i]));
            result+=data[i];
        }
        return  result;
    }
    
    在windows上

    是否 OMP_NUM_TREADS 时间

    无                     3.437s

    有        2           1.586

    有        4            1.349

    有        8             1.46

    在linux上

    无           2.9036

    有   12   13.9541

    有    6      6.792




    可以看到windows上做了将近三倍的加速,但是在linux上速度降低。可能是编程的方式不对。

    下面将对其进行分析,希望能实现12倍加速



    首先看如何看时间

    #include <time.h>
    #include <iostream>
    using namespace std;
    
    
    int main()
    {
        clock_t startTime,endTime;
        startTime = clock();
        for (int i = 0; i < 10000000; i++)
        {
            i++;
        }
        endTime = clock();
        cout << "Totle Time : " <<(double)(endTime - startTime) / (CLOCKS_PER_SEC*1000) << "ms" << endl;
        return 0;
    }
    

    在linux上运行能看到结果 

    [1] linux下查看核数

    [2] windows下查看核数

    [3] windows下openmp的配置 

    [4] linux下openmp编程基础 

    [5] c++并行与分布式编程[书籍]

    展开全文
  • Parallelism in Modern C++ - Hartmut Kaiser - CppCon 2016
  • 这是基于Microsoft Viusal C++系统开发的代码示例,用来说明并行模式库(Parrallel Patterns Library, PPL)和异步代理库(Asynchronous Agents Library, AAL)的使用方法。通过学习这些实例,您可以大大改善应用...
  • opencl代码,具有参考意义,可以看看。。。对我帮助大
  • c++11并行编程

    千次阅读 2019-11-01 14:21:32
    memory_order参数将有利于编译器进一步释放并行的潜在性能。c++11中保证顺序一致性: 编译器保证原子操作的指令间顺序不变。 处理器对原子操作的汇编指令执行顺讯不变。对于强顺序体系结构,无影响,但是对于...

    join()的作用是等待线程本对象销毁。

    通过#include <cstdatomic>头文件中来使用对应于内置类型的原子类型定义,如atomic_llong.

    也可以使用std::atomic<T> t;

    atomic-integral-type和integral-type标识的是上表的原子类型,class-type则指自定义类型。读(load)写(store)交换(exchange)、比较交换(compare_exchange_weak +strong)、

    atomic_flag(布尔类型且是无锁的(lock-free)也就是说线程对其访问不需要加锁,通过atomic_flag的成员test_and_set以及clear,可以实现一个自旋锁) ,test_and_set()是一种原子操作,用于在一个内存空间原子地写入新值并且返回旧值。

     

    c++11中,原子类型只能从模板参数类型中进行构造,标准不允许原子类型进行拷贝构造、移动构造以及 使用operator=等。

     

    c++11要想定义原子的自定义类型,则需要使用新关键字_Atomic来完成。

    memory_order参数将有利于编译器进一步释放并行的潜在性能。c++11中保证顺序一致性:

    编译器保证原子操作的指令间顺序不变。

    处理器对原子操作的汇编指令执行顺讯不变。对于强顺序体系结构,无影响,但是对于弱类型的体系结构,在每次原子操作后加入内存栅栏。

    c++11允许程序员委员自操作支付那个所谓的内存顺序: memory_order.

    atomi扯<int> a {0};

    atmomic <int> b {0};

    int ValueSet(int) {

        int t = 1;

        a.store(t,, memory_order_relaxed);

        b.store(2, memory_order_relaxed);   //1参数为要写入值,而是一个枚举值,标识使用松散的内存模型,该指令可以任由编译器重排序或者由处理器乱排序执行。解除了先于发生的限制。

    }

    表中最后一个memory_order_seq_cst就位c++11中所有的atomic原子操作的默认值

    原子存储操作(store):memory_order_relaxed、memory_order_release、memeory_order_seq_cst.

    原子读操作(load):memory_order_relaxed、memory_order_consume、memory_order_acqiuire、memory_order_seq_cst。

    RMW(read_modify_write):即一些需要同时读写的操作,memory_order_relaxed、memory_order_consume、memory_order_release、memory_order_acquire、memory_order_release,memory_order_acq_rel,memory_order_seq_cst。

     

    TLS变量:每个线程将拥有独立这个变量的拷贝,一个线程中对这个变量的读写并不会影响另外一个线程中变量的值。

    c++11中对TLS标准做出了规定:通过thread_local修饰符声明  int thread_local errCode;

     一旦声明一个变量为thred_local,其值将在线程开始时被初始化,而在线程结束时,该值也将不再有效。对变量&取地址,也是只能取到当前线程中的变量的地址。

     

    c++中终止函数如terminate、abort、exit等。

    terminate: 属于异常处理的一部分,没有被捕获的异常就会触发这个函数的调用,此外,noexcept如果抛出异常也会调用。诸如此类,非程序预期的行为都会可能导致terminate函数的调用。terminate函数在默认情况下 会调用abort函数,可以通过set_terminate函数来改变默认行为。二者都不会调用析构,

    abort: 更加底层,默认情况下回向合乎POSIX标准的系统抛出一个信号:SIGABRT.最下策的终止,容易出现问题。

    exit: "正常退出",会调用自动变量的析构函数,并且还会调用atexit注册的函数。跟main函数结束时的清理工作是一样的。如果代码中有很多类,这些类在对空间上分配了大量的零散内存,依次清理时会,只是标记未使用就可以了,但是实际需要释放析构的过程,是毫无意义的。

    c++11 标准引入quick_exit函数,该函数并不执行析构函数而只是使程序终止。与exit同属正常退出。使用at_quick_exit注册的函数也可以在quick_exit时被调用。

    展开全文
  • 最近在编程时,由于涉及到大量for循环等遍历计算,需要了解并行编程知识,于是看了下OpenMP的相关教程; 何为OpenMP?以下为百科内容: OpenMP是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受,...

    最近在编程时,由于涉及到大量for循环等遍历计算,需要了解并行编程知识,于是看了下OpenMP的相关教程;

    何为OpenMP?以下为百科内容:


    OpenMP是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受,用于共享内存并行系统的多处理器程序设计的一套指导性编译处理方案(Compiler Directive) [1] 。OpenMP支持的编程语言包括CC++Fortran;而支持OpenMp的编译器包括Sun Compiler,GNU Compiler和Intel Compiler等。OpenMp提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMp时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行


    在用OpenMP进行并行编程时,只需要加入#pragma omp parallel语句以及后面的操作命令即可,十分简单,便于程序员操作;

    下面以vs为例,介绍OpenMP的简单用法:

    1、首先,新建项目并添加代码后,需要打开vs的OpenMP支持选项:右键项目属性-C/C+±语言-OpenMP支持
    在这里插入图片描述
    2、其次,需要添加头文件<omp.h>

    3、OpenMP有很多命令可以用,比较常见的就是用于for循环来提升循环效率,即

    #pragma  omp parallel for
    

    4、在使用OpenMP时,要注意避免线程数据之间的竞争而导致计算出现差错,同时,亦应合理管理私有数据和公有数据

    为避免线程数据之间的竞争而导致计算出现差错,下面是应用的一个例子

    #include "pch.h"
    #include <iostream>
    #include <stdio.h>
    #include "omp.h"
    #include<ctime>
    using namespace std;
    int main(int argc, char **argv) {
    	//设置线程数,一般设置的线程数不超过CPU核心数,这里开4个线程执行并行代码段
    	omp_set_num_threads(8);
    	double start = clock();
    	int sum=0;
    #pragma omp parallel 
    	{
    	#pragma omp for reduction(+:sum)
    		for (int i = 0; i < 40000; i++)
    		{
    			for (int j = 0; j < 40000; j++)
    			{
    				//cout << "i = " << i << ", I am Thread " << omp_get_thread_num() << endl;
    				sum += 1;
    			}
    		}	
    	}
    	printf("sum=%d\n", sum);
    	double end = clock();
    	printf("Running time= %f", (end - start)/CLOCKS_PER_SEC);
    }
    

    reduction(+:sum)

    冒号前面的“+”表示在各线程中sum要保留数据,计算结束后一起累加。

    当然,OpenMP 不止能做累加,凡是累计运算都是可以的,如下表所示:

    操作私有临时变量初值
    +、-0
    *1
    &~0
    |0
    ^0
    &&1(true)
    ||0(false

    再如,为合理管理私有数据和公有数据,private命令可以声明循环的私有变量,这些变量在各线程中互相独立,互不影响,但是要注意,private不可声明static变量;

    #pragma  omp parallel for private(k1,k2)
    		for (k1 = 1; k1 < 100; k1++)
    		{
    			for (k2 = 1; k2 < 100; k2++)
    			{
    				cout <<"k1="<< k1 << endl;
    				cout <<"k2="<< k2 << endl;
    				cout << "k=" << k << endl;
    			}
    			
    		}
    
    展开全文
  • C++并行与分布式编程_肖和平2004译.pdf
  • C++并行程序设计

    2018-09-08 18:32:02
    C++并行程序设计 仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
  • 通过PVM为C++增加并行编程能力;错误处理、异常和软件可靠性;C++分布式面向对象编程;MPI与使用模板的SPMD和MPMD模型;可视化并发和分布式系统设计;设计支持并发的组件;实现面向agent的体系结构;使用PVM、线程和...
  • C++ 并行编程《一》

    2019-10-04 13:20:28
    1.最简单的C++多线程程序 #include <iostream> #include <thread> void do_something() { std::cout << "func do_something..." << std::endl; } int main(int argc, char *...
  • 最近学OpenCV 需要用到并行处理 ,通过查资料发现太乱,有的说明是介绍并行的 却在好长代码里作为演示,让人难以捉摸真正的用法,在此我特意做个简单的实例程序,希望能帮助大家学习 使用节省学习时间。其优势就是...
  • C++并行编程——openMP

    千次阅读 2016-06-28 16:03:58
    本文转载自 ... (1)openMP的配置(windows平台+vs2010)。在Visul Studio中配置openMP十分简单,只需打开“项目 - > 属性 - > C/C++ - > 语言”中将“OpenMPI支持”选为"是" 如下图所示:
  • C++ 并行编程之原子操作的内存顺序

    千次阅读 2018-12-10 23:44:05
    C++ 并行编程之原子操作的内存顺序 1. C++原子操作的内存顺序概述 memory order主要有以下几种: memory_order_relaxed 只提供对单个atomic变量的原子读/写,不和前后语句有任何memory order的约束关系。 ...
  • 两个版本的图书,我是买的积分下载的。现在我只要一个积分,希望大家支持。
  • C++】并发编程

    2021-09-27 10:15:26
    1.1.1 并发与并行 并发:同一时间段内可以交替处理多个操作,强调同一时段内交替发生。 并行:同一时刻内同时处理多个操作,强调同一时刻点同时发生。 1.1.2 硬件并发与任务切换 单片机上的单核处理器支持并发多任务...
  • Xilinx官方翻译的《FPGA并行编程》,本书以10个数字信号处理为例,带我们了解HLS如何使C代码并行运行,深入浅出的将HLS实现方法,硬件设计的考虑 以及系统优化都一一介绍。本书可以在小白仓库微信公众号号免费下载,...
  • C++并行与并发

    千次阅读 2022-04-21 14:01:38
    文章目录1cpu核数与线程1.1核心(core)1.2虚拟核(virtual core)2进程、线程、并发、并行2.1定义2.2区别3 C++并行并发3.1c++与并发3.2c++与cpu并行3.3 c++与GPU并行 写在前面的话:这篇文章借鉴了很多文章,csdn...
  • C++并行与分布式编程_肖和平2004译
  • 并发与并行 并发:多个任务可以同时存在。程序在逻辑上可以实现多个任务同时存在,那么这个程序就是并发程序。并发程序在物理实现上既可以是并行,也可以是串行。 串行:单个处理器通过“任务切换”的方式,在一秒...
  • 以下资料大部分来自《C++并行与分布式编程》,英文版叫《Parallel and Distributed Programming Using C++》。有兴趣的同学可以找来看一下。 1、什么是并发? 如果两个事件是在同一时间间隔内发生的,就说这两个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,003
精华内容 24,801
关键字:

c++ 并行编程

c++ 订阅
友情链接: pid-basic.rar