添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

使用parallel指令只是产生了并行域,让多个线程分别执行 相同的任务 ,并没有实际的使用价值。parallel for用于生成一个并行域,并将计算任务在多个线程之间分配,从而加快计算运行的速度。可以让系统默认分配线程个数,也可以使用num_threads子句指定线程个数。

2.parallel for时间问题

// OpenMPTest.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include "omp.h"
#include <iostream>
using namespace std;
//void main()
//#pragma omp parallel for num_threads(6)
//	//上面程序指定了6个线程,迭代量为12,每个线程都分配到了2次的迭代量
//	//备注:如果for循环比较简单(执行时间短),不建议使用多线程并发,因为线程
//	//间的调度也会比较耗时,是一个不小的开销。
//	for (int i = 0; i < 12;i++)
//		printf("OpenMP Test,线程编号为:%d\n", omp_get_thread_num());
//	system("pause");
//OpenMP效率提升以及不同线程数效率对比
void test()
	for (int i = 0; i < 80000; i++)
void main()
	float startTime = omp_get_wtime();
	//指定两个线程
#pragma omp parallel for num_threads(2)
	for (int i = 0; i < 80000; i++)
		test();
	float endTime = omp_get_wtime();
	printf("指定 2 个线程,执行时间: %f\n", endTime - startTime);
	startTime = endTime;
	//指定4个线程
#pragma omp parallel for num_threads(4)
	for (int i = 0; i < 80000; i++)
		test();
	endTime = omp_get_wtime();
	printf("指定 4 个线程,执行时间: %f\n", endTime - startTime);
	startTime = endTime;
	//指定8个线程  
#pragma omp parallel for num_threads(8)
	for (int i = 0; i < 80000; i++)
		test();
	endTime = omp_get_wtime();
	printf("指定 8 个线程,执行时间: %f\n", endTime - startTime);
	startTime = endTime;
	//指定12个线程
#pragma omp parallel for num_threads(12)
	for (int i = 0; i < 80000; i++)
		test();
	endTime = omp_get_wtime();
	printf("指定 12 个线程,执行时间: %f\n", endTime - startTime);
	startTime = endTime;
	//不使用OpenMP
	for (int i = 0; i < 80000; i++)
		test();
	endTime = omp_get_wtime();
	printf("不使用OpenMP多线程,执行时间: %f\n", endTime - startTime);
	startTime = endTime;
	system("pause");

3.结果显示 

可见,使用OpenMP优化后的程序执行时间是原来的1/8左右,并且并不是线程数使用越多效率越高,一般线程数达到4~8个的时候,不能简单通过提高线程数来进一步提高效率。

https://blog.csdn.net/u011808673/article/details/80319792

从初始状态S开始,利用规则,生成所有可能的状态。构成树的下一层节点,检查是否出现目标状态G,若未出现,就对该层所有状态节点,分别顺序利用规则。生成再下一层的所有状态节点,对这一层的所有状态节点检查是否出现G,若未出现,继续按上面思想生成再下一层的所有状态节点,这样一层一层往下展开。(5)把node的所有后继节点放在queue表的末端。(6)若后继节点中某一个是目标节点,则找到一个解,成功退出。(4)扩展node节点。若没有后继即叶节点),则转向(2)循环。(2)如果queue是空表,则失败退出,否则继续。 FastFlow:C++ 中的高性能并行模式 Galois:使用不规则并行简化并行编程的 C++ 库 Heteroflow:使用现代 C++ 进行并发 CPU-GPU 任务编程 HPX:用于并发和并行的 C++ 标准库 英特尔TBB:线程构建基块 Kokkos:用于在 HPC 平台上编写高性能便携式应用程序的 C++ 编程模型 OpenMP:C/C++ 和 Fortran 中的多平台共享内存并行编程 RaftLib:用于启用流和数据流并行计算的 C++ 库 STAPL:C++ 中的标准模板自适应并行编程库 STLab:用于实现具有最小争用的多核算法的高级构造 Transwarp:用于任务并发的仅标头 C++ 库 工作流程:C++ 并行计算 提取骨架是计算机断层扫描(CT)三维(3D)血管图像定量分析中的关键步骤,通常耗费数小时,直接制约了图像分析的定量研究。分析串行骨架细化算法各步骤中包含的可并行化操作,对其进行并行化设计,提出的算法通过OpenMP多线程技术实现,并采用不同大小的三维CT血管图像进行分析和测试。根据测试结果,改进后的算法获取到的骨架准确可靠,对于1.95 GB大小的三维血管图像,使用16个线程进行并行运算时,可将运算时间由176 min缩短到13 min,时间消耗上降低了一个数量级。因此,提出的方法可实现大型血管骨架的准确、高效提取,解决了大型三维图像分析问题中运算效率低这一瓶颈问题。 多线程在实际的编程中的重要性不言而喻。对于C++而言,当我们需要使用多线程时,可以使用boost::thread库或者自从C++ 11开始支持的std::thread,也可以使用操作系统相关的线程API,如在Linux上,可以使用pthread库。除此之外,还可以使用omp来使用多线程。它的好处是跨平台,使用简单。 在Linux平台上,如果需要使用omp,只需在编译时使用"-fopenmp"指令。在Windows的visual pthread_create (thread, attr, start_routine, arg) 在这里,pthread_create创建一个新的线程,并让它可执行。下面是关于参数的说明: thread 指向线程标识符指针。 一个不透明的属性对象,可以被用来设置线程. find_package(OpenMP REQUIRED)target_link_libraries(CodeCraft-2021 PUBLIC OpenMP::OpenMP_CXX) ????可左右滑动查看完整代码 在矩阵求和例子中,我们可以把任务均分到每个线程上,每个线程负责计算矩阵的一部分的和,最后对所有线程求得的和进行汇总,代码如下: 预处理指令pragma 在系统中加入预处理器指令一般是用来允许不是基本c语言规范部分的行为。不支持pragma的编译器会忽略pragma指令提示的那些语句,这样就允许使用pragma的程序在不支持它们的平台上运行。 第一个程序:hello #include <stdio.h> #include <stdlib.h> #include <omp.h> void ... 并行计算机可以简单分为共享内存和分布式内存,共享内存就是多个核心共享一个内存,目前的PC就是这类(不管是只有一个多核CPU还是可以插多个CPU,它们都有多个核心和一个内存),一般的大型计算机结合分布式内存和共享内存结构,即每个计算节点内是共享内存,节点间是分布式内存。想要在这些并行计算机上获得较好的性能,进行并行编程是必要条件。目前流行的并行程序设计方法是,分布式内存结构... 基本思想:因为看NCNN源码,发现up主代码中,使用OpenMP预编译指令,所以详细查阅了资料,简单了学习一下,等有时间在补充NCNN代码的中的实例,这里原理不详细叙述,只记录使用,以备后续用到好查阅; 编译工具使用Clion2021.1.1,因为使用OpenMP的主要目的在于加速处理指令,因此会着重比较一下串行程序和OpenMP并行程序的执行效率问题,有时间在补充OpenMP多线程的执行效率 (1)OpenMP的常用的函数和使用: 测试代码:(cmakelists.txt不在重复黏贴) #include <time.h> ////////////////////////////////////////////////////////////////////////////////////////////////////// void omp_thread_test() int coreNum = omp_get_num_. 下面是一个最简单的OpenMP程序,可以运行后观察结果与普通程序有什么不同。 请在适当的位置填上#pragma omp parallel for使程序并行执行。每次输出的结果可能会有所区别。