2011-10-29 50 views
2

我正在編寫一個程序,它必須對多個文件進行計算foobarfoobar可以在一個文件中並行或連續執行,程序將接收許多文件(,它們可以是不同的大小! )並且使用指定數量的線程並行或按順序應用計算foobaropenMP如何獲得更好的工作平衡?

這是程序如何啓動8個文件與三個線程。

./program 3 file1 file2 file3 file4 file5 file6 file7 file8 

我實現的默認調度是並行地影響每個文件上的一個線程來執行計算(這就是我的程序現在的工作方式!)。

版:這裏是我使用

#pragma omp parallel for private(i) schedule(guided,1) 
for (i = 0; i < nbre_file; i++) 
    foobar(files[i]); // according to the size of files(i) foobar can react as a sequential or a parallel program (which could induce nested loops) 

見下

Default scheduling

圖像在上面的最終時間的圖像默認調度的時間花依次在最大文件file8上依次解決foobar

我認爲一個更好的調度將有效地處理工作平衡,可以並行地應用大文件上的計算foobar。就像在下面的圖片中,tr我代表一個線程。

enter image description here

這樣的方式在最後的時間將是一個支出來解決並行foobar像上面我們使用了兩個線程!)上的最大文件file8

我的問題是:

可以用openmp來做這樣的調度嗎?

感謝您的回覆!

回答

1

您是否試過dynamic調度而不是指導?

如果正常的調度子句不適合你,你可以嘗試手動並行化循環,並手動將文件分配給某些線程。所以你的循環看起來像這樣:

#pragma omp parallel 
{ 
    id = omp_get_thread_num(); 
    if(id==0){ //thread 0 
     for (i = 0; i < nbre_of_small_files; i++) 
      foobar(files[i]); 
    } 
    else { //thread 1 and 2 
     for (j = 0; j < nbre_of_big_files; j=j+2) 
      if(id==1){//thread 1 
       foobar(files[j]); 
      } 
      else{ //thread 2 
       foobar(files[j+1]); 
      } 
    } 

} 

在這裏線程0做所有的小文件。線程二和三做大文件。

+0

是否有可能使tr1和tr2同時在foobar [i]上工作?謝謝你的回覆 –

+0

看看:[這](http://stackoverflow.com/questions/7149606/openmp-nested-loop)我通常避免嵌套平行區域。 – tune2fs