C++
C++
常思大妹子
自学成才的社会学女硕士
展开
-
OpenMP编程(6)—数据作用域(private、firstprivate、lastprivate、shared、default、reduction、copyin、threadprivate)
数据作用域说明:数据作用域定义了程序串行部分中的数据变量中的哪些以及如何传输到程序的并行部分,定义了哪些变量对并行部分中的所有线程可见,以及哪些变量将被私有地分配给所有线程。数据作用域子句可与多种指令(如parallelL、for、sections等)一起使用,以控制封闭区域变量的作用域OpenMP基于共享内存编程模型,所以大多数变量在默认情况下是共享的1. parivate2. firstprivate3. lastprivate4. shared5. shared6. defaul原创 2020-07-04 21:27:05 · 3563 阅读 · 0 评论 -
OpenMP编程(5)—同步结构(master、critical、barrier、atomic、flush、ordered)
OpenMP的同步结构(Synchronization Constructs)指令包master、critical、barrier、atomic、flush、ordered等1. master指令master指令指定的区域只由主线程执行,团队中其他线程都跳过该区域代码本指令没有隐含的barrier,即其他线程不用再master区域结束处同步,可立即执行后续代码。代码示例如下#pragma omp parallel { #pragma omp master { printf("i原创 2020-07-02 19:53:51 · 6714 阅读 · 0 评论 -
OpenMP编程(4)—sections、single指令
1. sections指令1.1 sections指令用途SECTIONS指令用于非迭代的多线程共享区。它指定各个section代码段分配给一组线程中部分线程。多个独立的section指令嵌套在sections指令中,每个section由于其中一个线程执行一次。不同的section可以由不同的线程执行。当然对于一个线程来说,如果它运行足够快,是有可能执行多个section。1.2 sections语法格式#pragma omp sections [clause ...] newline原创 2020-07-01 13:13:56 · 3108 阅读 · 0 评论 -
OpenMP编程(3)—for指令(含schedule、nowait)
1. for指令用途for指令指定紧随其后的循环迭代由一组线程并行执行。2. for指令语法格式#pragma omp for [clause ...] newline schedule (type [,chunk]) ordered private (list) firstprivate (list) lastprivate (li原创 2020-07-01 09:58:06 · 3599 阅读 · 0 评论 -
OpenMP编程(2)—并行区域(Parallel Region)
1. 并行区域(Parallel Region)概念并行区域是由多个线程执行的代码块,是基本的OpenMP并行结构。当一个线程到达并行指令时,它将创建一组线程并成为主(master)线程,其线程号为0。从这个并行区域开始,代码被复制,所有线程都将执行该代码。在并行区域的结尾有一个隐含的屏障(barrier),只有主线程继续执行超过此点。如果任何线程在一个并行区域内终止,那么该组的所有线程都将终止。2. 并行区域的代码示例 int nthreads, tid; // fork一组线程,并原创 2020-06-30 19:50:58 · 1883 阅读 · 0 评论 -
OpenMP编程(1)—基础概念
OpenMP是什么一种应用程序接口(API),可用于对程序显式地设置多线程、基于共享内存地并行处理通过来自硬件和软件行业、政府和学术界的相关方之间的协作,实现多处理的开放规范包含三种主要的API组件:编译指令(Compiler Directives)、运行时库(Runtime Library Routines)、环境变量(Environment Variables)OpenMP不是什么不能用于分布式内存并行系统不需要由所有供应商来统一实现不能保证最有效地利用共享内存OpenMP的目标原创 2020-06-29 23:55:40 · 537 阅读 · 0 评论 -
MPI编程(4)—集合通信MPI_Bcast、MPI_Gather、MPI_Scatter、MPI_Reduce
1. MPI_Bcast:广播消息MPI_Bcast用于将一个进程的buffer中的数据广播到其他进程的相同buffer变量中代码示例如下: int rank, data[10]; MPI_Init(0, 0); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (rank == 0) { for (int i = 0; i < 10; ++i) { data[i] = i + 1; } } //进程0广播数据原创 2020-06-22 20:24:38 · 5912 阅读 · 0 评论 -
MPI编程(3)—点对点通信(阻塞式MPI_Send/MPI_Recv和非阻塞式MPI_Isend/MPI_Irecv)
1.MPI的两种点对点通信方式MPI的点对点通信包括阻塞式和非阻塞式:阻塞式通信调用 MPI_Send/MPI_RecvMPI_Send不会返回,调用MPI_Send发送数据的进程会被阻塞,直到缓存为空MPI_Recv不会返回,调用 MPI_Recv接收数据的进程会被阻塞,直到缓存被填充非阻塞式通信调用 MPI_Isend/MPI_Irecv调用MPI_Isend或MPI_Irecv会马上返回2. MPI_Send/MPI_Recv代码示例MPI_SEND/MPI_RECV的代码示例原创 2020-06-20 23:43:11 · 8595 阅读 · 1 评论 -
从调用动态库带stl接口崩溃来区分/MDd和/MTd
本文的开发环境是Windows下的Visual Studio。1. 调用动态库带stl的接口引起的程序崩溃1.1 动态库实现接口动态库实现接口很简单,就是对传入的vector中增加元素void MyDll::AddVecElement(vector<int>& vecTest){ for (int i = 0; i < 100000; ++i) { vecTest.push_back(i); }}1.2 调用者代码调用者声明了个vector,并调用动态原创 2020-06-18 19:21:01 · 569 阅读 · 0 评论