OpenMP平行計算的使用5
阿新 • • 發佈:2021-02-07
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