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

1.定义

 使用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

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于warpAffine QTC++例程的并行化,可以使用OpenMP多线程库来实现。以下是一些可以尝试的步骤: 1. 引入OpenMP头文件,并启用OpenMP编译选项: ```c++ #include <omp.h> #pragma omp parallel for ``` 2. 通过分割任务来并行计算,例如对于warpAffine函数中的循环迭代,可以将其分割成多个任务,每个任务都在不同的线程中运行。在这里,我们可以使用for循环来创建这些任务: ```c++ #pragma omp parallel for for (int i = 0; i < dst.rows; i++) { for (int j = 0; j < dst.cols; j++) { // 计算像素位置 dst.at<cv::Vec3b>(i, j) = getAffinePixel(src, i, j, M); } } ``` 3. 在并行计算过程中,需要注意线程间的数据共享和同步问题。在这里,由于每个线程都需要访问源图像和目标图像,因此需要采用线程安全的方式来访问这些数据。可以使用OpenMP的reduction指令来实现对变量的同步操作: ```c++ #pragma omp parallel for reduction(+:sum) for (int i = 0; i < dst.rows; i++) { for (int j = 0; j < dst.cols; j++) { // 计算像素位置 cv::Vec3b pixel = getAffinePixel(src, i, j, M); dst.at<cv::Vec3b>(i, j) = pixel; // 计算颜色之和 sum += pixel[0] + pixel[1] + pixel[2]; } } ``` 4. 最后,要记得在程序退出时关闭OpenMP线程: ```c++ omp_set_num_threads(num_threads); // 并行计算 ... // 关闭线程 omp_set_num_threads(1); ``` 这些步骤可以帮助您实现warpAffine QTC++例程的并行化,提高程序的执行效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值