【OpenMP】parallel for使用多线程进行并行加速

1.定义

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

2.parallel for时间问题

// OpenMPTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "omp.h"

#include 

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】parallel for使用多线程进行并行加速_第1张图片

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

参考 :

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

你可能感兴趣的:(OpenMP,OpenMP)