1. 程式人生 > 其它 >OpenMP平行計算的使用5

OpenMP平行計算的使用5

技術標籤:平行計算筆記openmp

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