简单实用openmp

Openmp

我把它简单理解为并行加速,做图像处理时特别有用,可以以最简单的方法极大的提升效率,节约时间,特别是高分辨率图像处理。

使用openmp,在vs中使用需要将openmp勾选一下,

然后加上头文件<omp.h>,

下面是使用例子

void OpenmpTest()
{
	cv::Mat img;
	//img.create(cv::Size(2880, 1440), CV_32FC1);
	img = cv::Mat(cv::Size(2880, 1440), CV_32FC1, cv::Scalar(12));
	//img.create(cv::Size(2880, 1440), CV_8UC1);
	int i, j;
	int w = img.cols;
	int h = img.rows;
	int k;
	int up = 50;
	float *data = (float *)img.data;
	//uchar *data = img.data;
	int64 tt;

	tt = cv::getTickCount();
#pragma omp parallel for
	for (i = 0; i < h; i++)
	{
#pragma omp parallel for
		for (j = 0; j < w - 1; j++)
		{
			//data[i * w + j] = data[i * w + j] * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9;
//#pragma omp parallel for
			//for (k = 0; k < up; k++)
			{
				//data[i * w + j] = data[i * w + j] + data[i * w + j] * 50.8 / 64.1;
				//data[i * w + j] = (float)50.8;
				//data[i * w + j + 1] = (float)50.8;
				data[i * w + j] = data[i * w + j] * data[i * w + j + 1];
				//img.at<float>(h, w) = (float)50.8;
			}
		}
	}
	std::cout << "openmp: " << (cv::getTickCount() - tt) / cv::getTickFrequency() * 1000 << "ms" << std::endl;

	//tt = cv::getTickCount();
	//for (i = 0; i < h; i++)
	//{
	//	for (j = 0; j < w; j++)
	//	{
	//		//data[i * w + j] = data[i * w + j] * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9;
	//		for (k = 0; k < up; k++)
	//		{
	//			data[i * w + j] = data[i * w + j] + data[i * w + j] * 50.8 / 64.1;
	//		}
	//	}
	//}
	//std::cout << "normal: " << (cv::getTickCount() - tt) / cv::getTickFrequency() * 1000 << "ms" << std::endl;
}

img是一幅自建的图像,直接取址赋值就行,但是测试.at<h,w>程序就崩掉。

如果调用的库有使用openmp,那主程序最好也勾选上支持,否则有可能出错,目前不清楚是哪里出错,但是不勾选最后生成的应用程序在win7上跑特别慢。

猜你喜欢

转载自blog.csdn.net/bcfd_yundou/article/details/53813460
今日推荐