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...