OpenMP并行计算的使用5

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。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值