OpenMP建立執行緒中的鎖及原子操作效能比較 5

2021-05-25 18:39:38 字數 3192 閱讀 2797

openmp建立執行緒中的鎖及原子操作效能比較

相關文件連線:

多核程式設計中的任務隨機競爭模式的概率分析

多核程式設計中的任務分組競爭模式

多核程式設計中的負載平衡難題

多核程式設計中的鎖競爭難題

多核程式設計的幾個難題及其應對策略(難題一)

openmp

並行程式設計(二)

openmp

並行程式設計(一)

雙核cpu

上的快速排序效率

在多核原子操作選用

interlockedincrement來進行測試,

對每種鎖和原子操作,都測試在單任務執行和多工執行

2000000次加鎖解鎖操作所消耗的時間。

測試的詳細**見後面。

測試機器環境:

intel 2.66g 雙核cpu 機器一台

測試執行結果如下:

singlethread, interlockedincrement 2,000,000: a = 2000000, time = 78

multithread, interlockedincrement 2,000,000: a = 2000000, time = 156

singlethread, critical_section 2,000,000:a = 2000000, time = 172

multithread, critical_section, 2,000,000:a = 2000000, time = 3156

singlethread,omp_lock 2,000,000:a = 2000000, time = 250

multithread,omp_lock 2,000,000:a = 2000000, time = 1063

在單任務運**況下,所消耗的時間如下:

原子操作                 78ms

windows criticalsection 172ms

openmp

的lock操作        250ms

因此從單任務情況來看,原子操作最快,

windows criticalsection次之,openmp庫帶的鎖最慢,但這幾種操作的時間差距不是很大,用鎖操作比原子操作慢了2~3倍左右。

在多個任務執行的情況下,所消耗的時間如下:

原子操作                 156ms

windows criticalsection 3156ms

openmp

的lock操作        1063ms

在多工運**況下,情況發生了意想不到的變化,原子操作時間比單任務操作時慢了一倍,在兩個

cpu上執行比在單個cpu上執行還慢一倍,真是難以想象,估計是任務切換開銷造成的。

windows criticalsection則更離譜了,居然花了

3156ms,是單任務執行時的18倍多的時間,慢得簡直無法想象。

openmp的

lock操作比windows criticalsection稍微好一些,但也花了1063ms,是單任務時的7倍左右。

由此可以知道,在多核

cpu的多工環境中,原子操作是最快的,而openmp次之,windows criticalsection則最慢。

同時從這些鎖在單任務和多工下的效能差距可以看出,,多核

cpu上的程式設計和以往的單核多工程式設計會有很大的區別。

需要說明的是,本測試是一種極端情況下的測試,鎖住的操作只是乙個簡單的加1操作,並且鎖競爭次數達200萬次之多,在實際情況中,一由於任務中還有很多不需要加鎖的**在執行,實際情況中的效能會比本測試的效能好很多。

測試**如下:

// testlock.cpp : openmp

任務中的原子操作和鎖效能測試程式。 //

#include

#include

#include

#include

#include

void

testatomic()

t2 = clock();

printf("singlethread, interlockedincrement 2,000,000: a = %ld, time = %ld/n", a, t2-t1);

t1 = clock();

#pragma

omp parallel for

for( i = 0; i < 2000000; i++ )

t2 = clock();

printf("multithread, interlockedincrement 2,000,000: a = %ld, time = %ld/n", a, t2-t1); }

void

testomplock()

t2 = clock();

printf("singlethread,omp_lock 2,000,000:a = %ld, time = %ld/n", a, t2-t1);

t1 = clock();

#pragma

omp parallel for

for( i = 0; i < 2000000; i++ )

t2 = clock();

printf("multithread,omp_lock 2,000,000:a = %ld, time = %ld/n", a, t2-t1);

omp_destroy_lock(&mylock); }

void

testcriticalsection()

t2 = clock();

printf("singlethread, critical_section 2,000,000:a = %ld, time = %ld/n", a, t2-t1);

t1 = clock();

#pragma

omp parallel for

for( i = 0; i < 2000000; i++ )

t2 = clock();

printf("multithread, critical_section, 2,000,000:a = %ld, time = %ld/n", a, t2-t1);

deletecriticalsection(&cs); }

intmain(int argc, char* argv)

OpenMP建立執行緒中的鎖及原子操作效能比較

多核程式設計中的任務隨機競爭模式的概率分析 多核程式設計中的任務分組競爭模式 多核程式設計中的負載平衡難題 多核程式設計中的鎖競爭難題 多核程式設計的幾個難題及其應對策略 難題一 openmp並行程式設計 二 openmp並行程式設計 一 雙核cpu上的快速排序效率 原子操作選用interlocke...

OpenMP建立執行緒中的鎖及原子操作效能比較

openmp建立執行緒中的鎖及原子操作效能比較 相關文件連線 多核程式設計中的任務隨機競爭模式的概率分析 多核程式設計中的任務分組競爭模式 多核程式設計中的負載平衡難題 多核程式設計中的鎖競爭難題 多核程式設計的幾個難題及其應對策略 難題一 openmp 並行程式設計 二 openmp 並行程式設計...

OpenMP 中的執行緒任務排程

openmp中任務排程主要針對並行的for迴圈,當迴圈中每次迭代的計算量不相等時,如果簡單地給各個執行緒分配相同次數的迭代,則可能會造成各個執行緒計算負載的不平衡,影響程式的整體效能。如下面的 中,如果每個執行緒執行的任務數量平均分配,有的執行緒會結束早,有的執行緒結束晚 1 include2 in...