這篇文章主要講解了“OpenMP創(chuàng)建線程中的鎖及原子操作性能分析”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“OpenMP創(chuàng)建線程中的鎖及原子操作性能分析”吧!
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了蘭西免費(fèi)建站歡迎大家使用!
windows CriticalSection, OpenMP的鎖操作函數(shù)在多核CPU中的性能。
原子操作選用InterlockedIncrement來進(jìn)行測試,
對每種鎖和原子操作,都測試在單任務(wù)執(zhí)行和多任務(wù)執(zhí)行2000000次加鎖解鎖操作所消耗的時間。
測試的詳細(xì)代碼見后面。
測試機(jī)器環(huán)境: Intel 2.66G 雙核CPU 機(jī)器一臺
測試運(yùn)行結(jié)果如下:
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
在單任務(wù)運(yùn)行情況下,所消耗的時間如下:
原子操作 78ms
Windows CriticalSection 172ms
OpenMP 的lock操作 250ms
因此從單任務(wù)情況來看,原子操作最快,Windows CriticalSection次之,OpenMP庫帶的鎖最慢,但這幾種操作的時間差距不是很大,用鎖操作比原子操作慢了2~3倍左右。
在多個任務(wù)運(yùn)行的情況下,所消耗的時間如下:
原子操作 156ms
Windows CriticalSection 3156ms
OpenMP 的lock操作 1063ms
在多任務(wù)運(yùn)行情況下,情況發(fā)生了意想不到的變化,原子操作時間比單任務(wù)操作時慢了一倍,在兩個CPU上運(yùn)行比在單個CPU上運(yùn)行還慢一倍,真是難以想象,估計(jì)是任務(wù)切換開銷造成的。
Windows CriticalSection則更離譜了,居然花了3156ms,是單任務(wù)運(yùn)行時的18倍多的時間,慢得簡直無法想象。
OpenMP的lock操作比Windows CriticalSection稍微好一些,但也花了1063ms,是單任務(wù)時的7倍左右。
由此可以知道,在多核CPU的多任務(wù)環(huán)境中,原子操作是最快的,而OpenMP次之,Windows CriticalSection則最慢。
同時從這些鎖在單任務(wù)和多任務(wù)下的性能差距可以看出,,多核CPU上的編程和以往的單核多任務(wù)編程會有很大的區(qū)別。
需要說明的是,本測試是一種極端情況下的測試,鎖住的操作只是一個簡單的加1操作,并且鎖競爭次數(shù)達(dá)200萬次之多,在實(shí)際情況中,一由于任務(wù)中還有很多不需要加鎖的代碼在運(yùn)行,實(shí)際情況中的性能會比本測試的性能好很多。
測試代碼如下:
// TestLock.cpp : OpenMP任務(wù)中的原子操作和鎖性能測試程序。 // #include#include #include #include #include void TestAtomic() { clock_t t1,t2; int i = 0; volatile LONG a = 0; t1 = clock(); for( i = 0; i < 2000000; i++ ) { InterlockedIncrement( &a); } 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++ ) { InterlockedIncrement( &a); } t2 = clock(); printf("MultiThread, InterlockedIncrement 2,000,000: a = %ld, time = %ld/n", a, t2-t1); } void TestOmpLock() { clock_t t1,t2; int i; int a = 0; omp_lock_t mylock; omp_init_lock(&mylock); t1 = clock(); for( i = 0; i < 2000000; i++ ) { omp_set_lock(&mylock); a+=1; omp_unset_lock(&mylock); } 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++ ) { omp_set_lock(&mylock); a+=1; omp_unset_lock(&mylock); } t2 = clock(); printf("MultiThread,omp_lock 2,000,000:a = %ld, time = %ld/n", a, t2-t1); omp_destroy_lock(&mylock); } void TestCriticalSection() { clock_t t1,t2; int i; int a = 0; CRITICAL_SECTION cs; InitializeCriticalSection(&cs); t1 = clock(); for( i = 0; i < 2000000; i++ ) { EnterCriticalSection(&cs); a+=1; LeaveCriticalSection(&cs); } 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++ ) { EnterCriticalSection(&cs); a+=1; LeaveCriticalSection(&cs); } t2 = clock(); printf("MultiThread, Critical_Section, 2,000,000:a = %ld, time = %ld/n", a, t2-t1); DeleteCriticalSection(&cs); } int main(int argc, char* argv[]) { TestAtomic(); TestCriticalSection(); TestOmpLock(); return 0; }
感謝各位的閱讀,以上就是“OpenMP創(chuàng)建線程中的鎖及原子操作性能分析”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對OpenMP創(chuàng)建線程中的鎖及原子操作性能分析這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!