2013-06-29 112 views
1

在沒有sudo權限的機器上剖析與OpenMP並行的C++程序的最簡單方法是什麼?剖析OpenMP並行化的C++代碼

+1

到目前爲止發現了什麼_you_? –

+0

Tau,OmpP,LIKWID都需要root權限:-( – lodhb

回答

6

我會推薦使用英特爾VTune Amplifier XE探查器。

基本熱點分析不需要root權限,您甚至可以在不使用sudoers的情況下安裝它。

對於OpenMP分析,最好使用英特爾OpenMP實施進行編譯,並在運行配置文件會話之前將環境變量KMP_FORKJOIN_FRAMES設置爲1。這將使工具能夠可視化每個平行區域從叉點到連接點的時間區域。這給出了一個很好的想法,即你有足夠的並行性以及你沒有做到的地方。通過使用像框架域/框架類型/功能這樣的網格分組,您還可以將並行區域與CPU上發生的事情相關聯,從而可以查找不會縮放的功能。例如,假設像下面這樣簡單的代碼運行一些平衡的工作,然後一些串行工作,然後一些不平衡的工作調用delay()函數來確保所有這些都確保delay()不內聯。這模仿真實負載,其中各類不熟悉的功能,可以從並行區域使其更難被調用來分析並行性是否是通過尋找到剛剛熱功能簡介好壞:

void __attribute__ ((noinline)) balanced_work() { 
    printf("Starting ideal parallel\n"); 
#pragma omp parallel 
    delay(3000000); 
} 
void __attribute__ ((noinline)) serial_work() { 
    printf("Starting serial work\n"); 
    delay(3000000); 
} 
void __attribute__ ((noinline)) imbalanced_work() { 
    printf("Starting parallel with imbalance\n"); 
#pragma omp parallel 
    { 
     int mythread = omp_get_thread_num(); 
     int nthreads = omp_get_num_threads(); 
     delay(1000000); 
     printf("First barrier %d\n", mythread); 
     #pragma omp barrier 
     delay(mythread * 25000 + 200000); 
     printf("Second barrier %d\n", mythread); 
     #pragma omp barrier 
     delay((nthreads - 1 - mythread) * 25000 + 200000); 
     printf("Join barrier %d\n", mythread); 
    } 
} 

int 
main(int argc, char **argv) 
{ 
    setvbuf(stdout, NULL, _IONBF, 0); 

    calibrate(); 
    balanced_work(); 
    serial_work(); 
    imbalanced_work(); 

    printf("Bye bye\n"); 
} 

對於這個代碼的典型函數配置文件將顯示在delay()函數中花費的大部分時間。另一方面,通過VTune中的幀分組和CPU使用率信息查看數據,可以瞭解什麼是串行,什麼是不平衡和什麼是平衡的。以下是你可能會看到VTune™可視化:

OpenMP frames for the sample

在這裏,人們可以看到:

  • 有當我們執行一個不平衡的區域經過時間13.671。人們可以看到來自CPU使用率故障的不平衡。
  • 經過時間有3.652次非常平衡。這裏有一些紅色的時間,這可能是一些系統的影響 - 值得在真實案例中進行調查。
  • 然後我也有約4秒的連續時間。弄清楚它是4秒是目前有點棘手 - 你必須從總結(我的情況下是21.276)花費時間,從它減去13.671和3.652產生四。但很容易。

希望這會有所幫助。

+0

是否還有其他KMP_ *選項,即特定於英特爾實施的OpenMP選項?我無法找到列表... – pascal

+0

KMP_ *環境變量的完整列表應該作爲編譯器文檔的一部分提供。 –