C++并行计算之OpenMP快速入门

2023-04-15 17:36:29 3341人已围观 11已点赞 6人已收藏

简介OpenMP是一种用于共享内存并行系统的多线程程序设计方案,本文向大家介绍C++并行计算之OpenMP快速入门,感兴趣的朋友可以参考一下。

OpenMP基本概念

OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C、C++和Fortran。OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的并行程序设计。编译器根据程序中添加的pragma指令,自动将程序并行处理,使用OpenMP降低了并行编程的难度和复杂度。当编译器不支持OpenMP时,程序会退化成普通(串行)程序。程序中已有的OpenMP指令不会影响程序的正常编译运行。

在VS中启用OpenMP很简单,很多主流的编译环境都内置了OpenMP。在项目上右键->属性->配置属性->C/C++->语言->OpenMP支持,选择“是”即可。

C++并行计算,OpenMP

使用

  • 添加头文件#include <omp.h>
  • 在对应的并行代码前添加#pragma omp parallel

一般需要并行运算的部分都是大量的循环操作。

简单例子


#include <omp.h>
#include <iostream>
using namespace std;

int main()
{
#pragma omp parallel
	{
		printf("C++实战网(www.cppszw.com), I am Thread %d\n", omp_get_thread_num());
	}
	return 0;
}

结果:(笔者电脑是4核,所以打印4个)

C++并行计算,OpenMP

常用的功能指令

C++并行计算,OpenMP

API函数

OpenMP还提供了一组API函数用于控制并发线程的某些行为,下面是一些常用的OpenMP API函数以及说明

C++并行计算,OpenMP

OpenMP for循环效率提升

#include <omp.h>
#include <windows.h>
#include <iostream>
using namespace std;

void Test(int n)
{
	for (int i = 0; i < 10000; i++)
	{
		for (int j = 0; j < 10000; j++)
		{
			// do nothing, just waste time
		}
	}
	printf("%d, ", n);
}

int main()
{
	float startTime = omp_get_wtime();
	for (int i = 0; i < 10; i++)
	{
		Test(i);
	}
	float endTime = omp_get_wtime();
	printf("time without OpenMP: %f\n", endTime - startTime);

	startTime = endTime;
#pragma omp parallel for
	for (int i = 0; i < 10; i++)
	{
		Test(i);
	}
	endTime = omp_get_wtime();
	printf("time with OpenMP: %.3f\n", endTime - startTime);
}

结果:

C++并行计算,OpenMP

更多例子可前往获取: https://github.com/wipping/openMP_demo

更多为你推荐