欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenMP并行计算的使用5

程序员文章站 2022-07-12 19:58:31
...

OpenMP创建线程中锁和原子操作性能比较
原子操作:在多进程(线程)的操作系统中不能被其它进程(线程)打断的操作就叫原子操作。原子操作是不可分割的。

#include<time.h>
#include<omp.h>
#include<iostream>
#include<windows.h>
#define NUM 2000000 //运算次数
using namespace std;

//测试原子操作
void TestAtomic()
{
	clock_t t1, t2;
	int i = 0;
	//LONG a = 0;
    volatile LONG a = 0; //volatile 的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值
	//测试单线程下原子操作
	t1 = clock();
	for (i = 0; i < NUM; i++)
	{
		InterlockedIncrement(&a); //原子操作自增
	}
	t2 = clock();
	cout << "SingleThread, InterLockedIncrement "<<NUM<<": a= " << a << ", time=" << t2 - t1 << endl; //此时a为NUM

	//测试多线程并发执行下原子操作
	t1 = clock();
#pragma omp parallel for
	for (i = 0; i < NUM; i++)
	{
		InterlockedIncrement(&a);
	}
	t2 = clock();
	cout << "MultiThread, InterLockedIncrement " << NUM << ": a= " << a << ", time=" << t2 - t1 << endl; //此时a为2*NUM
}

//测试omplock
void TestOmpLock()
{
	clock_t t1, t2;
	int i;
	int a = 0;
	omp_lock_t mylock; 
	omp_init_lock(&mylock); //init_lock()初始化一个简单锁,与destroy_lock()配对使用
	//测试单线程下上锁操作
	t1 = clock();
	for (i = 0; i < NUM; i++)
	{
		omp_set_lock(&mylock);
		a += 1;
		omp_unset_lock(&mylock);
	}
	t2 = clock();
	cout << "SingleThread, omp_lock " << NUM << ": a= " << a << ", time=" << t2 - t1 << endl; //此时a为NUM

	//测试多线程并发执行下锁操作
	t1 = clock();
#pragma omp parallel for
	for (i = 0; i < NUM; i++)
	{
		omp_set_lock(&mylock); //上锁
		a += 1;
		omp_unset_lock(&mylock); //解锁,和set配对使用
	}
	t2 = clock();
	cout << "MultiThread, omp_lock " << NUM << ": a= " << a << ", time=" << t2 - t1 << endl; //此时a为2*NUM

	omp_destroy_lock(&mylock); //关闭一个锁,与omp_init_lock()配对使用
}

int main()
{
	TestAtomic();
	TestOmpLock();

	return 0;
}

输出为:
OpenMP并行计算的使用5

原子操作快于openMP。

以上文字代码内容主要转载自:
https://blog.csdn.net/drzhouweiming/article/details/1175848