會員登入 新朋友?立刻註冊
[說明]
文章會慢慢移新精讚 //n.sfs.tw
2019/2/23 星期六     [文章分類及列表]
精讚Blog logo 部落格是自己寫爽的
精讚部落 > 系統應用 > LINUX
CPU 和多執行緒關係效能分析 次要群組 [後端程設::Perl 程式] 頭條文章 焦點文章 列印 推薦
作者或來源 瘦河馬 2010-01-07 10:51:52
關鍵字 1thread 2多執行緒 3cpu 4linux 5perl
此文完整連結 http://n.zipko.info/338.html
文章歡迎轉載,請尊重版權註明連結來源。

CPU 和多執行緒關係效能分析

在 linux上的怪異現象-網路程式比本機程式有更高的效能這篇文章中有提過這個怪異的現象,同時間我又將常態分配亂數函數寫成多執行緒的版本,心血來潮就測試執行緒的個數和 CPU 的個數的關係,以下是測試結果:

一、測試結果

多執行絮的版本:並就本機的部分進行測試,以下為測試結果:我把資料量設為1,000,000筆。時間單位為秒,並同時測五次平均。

本機直接叫用..Xeon3.06G 2cpu 兩顆都有跑起來
未用執行絮:4.7040182  <===單CPU運作,效能差
同時執行絮數 2: 2.443831  <===效能最佳
同時執行絮數 3: 2.471062
同時執行絮數 4: 2.4912988
同時執行絮數 6: 2.4845472
同時執行絮數 8: 2.4945126
同時執行絮數 16: 2.570592

本機直接叫用..IA64 4CPU
未用執行絮:8.462918 <== 單CPU運作
同時執行絮數 2: 4.352105 <===CPU 運作2個 重覆執行時會切換不 同CPU 組合
同時執行絮數 3: 2.9216384 <===CPU 運作 3 個
同時執行絮數 4: 2.2345432 <===毫無疑問效能最佳,4 CPU同時運作
同時執行絮數 6: 2.300519
同時執行絮數 8: 2.2873218
同時執行絮數 16: 2.2593788

二、討論

拿這兩台不同的機器來比較,一台是一般的 32 位元2 CPU的機器,時脈較高;另一台是64位元 4CPU時脈較低的機器來比較似乎沒什麼意義,不過還是畫出了比較表。

我把結果和中教大黃國展教授討論,他回應到:

我覺得應是顯示出了多 CPU 的價值, 因為 2 個 CPU 及 4 個 CPU 分別在 2個及4個 threads 時效能最好

但並未顯示出 IA64的價值, 因為未用 thread 時, IA64效能較差,且差很多, 我想這是因為 IA64的 clock rate 較低, 且程式或軟體本身也沒針對 IA64的新指令架構做最佳化的關係

黃國展

三、測試機器參數

1. 機器1 CentOS release 4.3 (Final) ,雙CPU,未開 HT。

$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 15
model           : 2
model name      : Intel(R) Xeon(TM) CPU 3.06GHz
stepping        : 9
cpu MHz         : 3052.879
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe cid xtpr
bogomips        : 6110.70

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 15
model           : 2
model name      : Intel(R) Xeon(TM) CPU 3.06GHz
stepping        : 9
cpu MHz         : 3052.879
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe cid xtpr
bogomips        : 6103.16

2. 機器2-  4 CPU,未開 HT。Ubuntu-IA64 Ver
$ uname -a 
Linux sfssvn 2.6.24-16-mckinley #1 SMP Thu Apr 10 14:53:59 UTC 2008 ia64 GNU/Linux

processor  : 0
vendor     : GenuineIntel
arch       : IA-64
family     : 32
model      : 0
model name : Intel(r) Itanium(r) 2 Processor 1.4GHz with 12M L3 Cache for 400MHz Platforms
revision   : 7
archrev    : 0
features   : branchlong, 16-byte atomic ops
cpu number : 0
cpu regs   : 4
cpu MHz    : 1400.028
itc MHz    : 350.007000
BogoMIPS   : 2793.47
siblings   : 2
physical id: 0
core id    : 0
thread id  : 0

processor  : 1
vendor     : GenuineIntel
arch       : IA-64
family     : 32
model      : 0
model name : Intel(r) Itanium(r) 2 Processor 1.4GHz with 12M L3 Cache for 400MHz Platforms
revision   : 7
archrev    : 0
features   : branchlong, 16-byte atomic ops
cpu number : 0
cpu regs   : 4
cpu MHz    : 1400.028
itc MHz    : 350.007000
BogoMIPS   : 2793.47
siblings   : 2
physical id: 0
core id    : 1
thread id  : 0

processor  : 2
vendor     : GenuineIntel
arch       : IA-64
family     : 32
model      : 0
model name : Intel(r) Itanium(r) 2 Processor 1.4GHz with 12M L3 Cache for 400MHz Platforms
revision   : 7
archrev    : 0
features   : branchlong, 16-byte atomic ops
cpu number : 0
cpu regs   : 4
cpu MHz    : 1400.028
itc MHz    : 350.007000
BogoMIPS   : 2793.47
siblings   : 2
physical id: 3
core id    : 0
thread id  : 0

processor  : 3
vendor     : GenuineIntel
arch       : IA-64
family     : 32
model      : 0
model name : Intel(r) Itanium(r) 2 Processor 1.4GHz with 12M L3 Cache for 400MHz Platforms
revision   : 7
archrev    : 0
features   : branchlong, 16-byte atomic ops
cpu number : 0
cpu regs   : 4
cpu MHz    : 1400.028
itc MHz    : 350.007000
BogoMIPS   : 2793.47
siblings   : 2
physical id: 3
core id    : 1
thread id  : 0

四、程式原始碼

 

#!/usr/bin/perl -w
#Program coded by axer@ms1.boe.tcc.edu.tw
use Time::Elapse;
use threads;            # 多執行緒

$thread_num = 2; #多執行絮數
$meanvalue = 6; # 均值
$sd =1;     # 標準差
$randnum = 1000000; # 產生組數
$dif = 1;   # 統計柱狀圖區間幾個 $sd
# ====== 以上是參數的設定部分 =======
print "Program Start....\n";
$t=0;
for(0..4){
Time::Elapse->lapse(my $now);
my @param0= ($meanvalue, int($randnum / $thread_num+ $randnum % $thread_num), $sd );
my @param= ($meanvalue, int($randnum/$thread_num), $sd );
#送入多執行絮處理
($thr[0]) = threads->create('dev', @param0 );
for(1...$thread_num-1){
   ($thr[$_]) = threads->create('dev', @param );
}
%res=();
$counter=0;
for(0...$thread_num-1){
    my %h2=();
    print "Thread $_...\n";
    %h2 = $thr[$_]->join();
    foreach $key (keys %h2) {
        $res{$key} += $h2{$key};
        $counter += $h2{$key};
        }
}
print "Elapsed time=". $now. "\n";
$now =~ /^00:00:(.+)$/;
$t += $1;
}

print "Avg=". ($t/5) ."\n";

#計算常態分佈標準差的函式
#create Normal Distribution random value
sub dev{
        my %h=();
        local $meanvalue = shift;
        local $randnum = shift;
        local $sd = shift;
        for(1..$randnum){
            do{
                $v1 = (2 * rand 1) - 1;
                $v2 = (2 * rand 1) - 1;
                $r = $v1 **2 + $v2 **2;
              }while($r >= 1);
        $fac = sqrt(-2 * log($r)/ log(exp(1)) / $r);
        $gauss = $v2 * $fac;
        $vr= $gauss * $sd + $meanvalue;

        $sddif = $sd*$dif;
        $hid= int( ( $vr + $sddif /2 ) / $sddif ) * $sddif;
        $h{$hid}++;
        }       # end for
        return %h;
}  # end dev


sub hashKeyAscendingNum {
   keys(%h) <=>  keys(%h) ;
}

 

END
F B 留 言 版

留言結束請重新整理網頁顯示留言
相 關 文 章
同 群 組 其 他 文 章
隨 機 文 章
精讚部落版權所有(c) JinZan Blog http://n.zipko.info Author axer@tc.edu.tw. 最佳瀏器為Firefox,本網頁不支援IE6。[文章分類及列表]
本站最佳瀏覽解析度1024x768 網站建置 2009.11