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。
以上文字代码内容主要转载自:
https://blog.csdn.net/drzhouweiming/article/details/1175848