2012-03-07 31 views
0

我有一個for循環大約需要16毫秒執行,並有條件地執行另一個for循環500次。並行只有內部的循環

產品序列號的格式是這樣的:

//Outer for loop 
for(i=0;i<500;i++){ 
//read some entity 
//some conditions 

// some function calls 
    // some nested function calls 
     // inner for loop 
      for (j=0;some condition;j++){ 
      // work on the entity read in outer for loop 

      } 

} 

我想並行內的循環。是否可以通過使用OpenMP將內部for循環執行所需的時間縮短40%,從而縮短運行串行代碼所需的總時間?

我希望總體時間減少來執行代碼。在我的情況下,並行外部for循環是不可能的,因爲代碼被編寫爲一次只能讀取一個實體,以便在內部循環中使用 。

請幫忙。

謝謝!

+0

16毫秒似乎並不是很多工作要並行化。 – Mysticial 2012-03-07 18:55:15

+0

是的,絕對正確。但是,內循環會執行很多次。我想減少程序執行所需的總時間。 – user1252852 2012-03-07 18:56:36

+0

我試圖在H.264編解碼器中並行化幀內和幀間預測。有關於此的任何建議? – user1252852 2012-03-07 18:58:23

回答

0

Openmp可以將這些小任務並列。我已經做過一次,以30 fps的視頻做5x5內核過濾器。

你應該測試什麼是最好的粒度。如果你把任務分成兩部分,你的開銷最小,但是你限制了平等主義。如果粒度太高,則循環頂點會變得更大,並且您可能正在寫入來自不同內核的相鄰內存位置,這會破壞緩存性能。

在我上面的示例中,我將圖像分爲掃描線,每個都是按順序計算的。這工作得很好。

+0

太棒了!謝謝。你能詳細說一點嗎?有沒有什麼方法可以通過使用#pragma omp部分而不是內部循環來實現輸出,並且有內部數據的多個副本?而這個內部for循環得到執行沒有。由for循環定義的時間。 – user1252852 2012-03-07 19:23:57

+0

實際上,這需要熟悉openmp和算法。只是灑#pragmas不會這樣做。根據我所瞭解的視頻預測,您可能不需要複製任何數據,所有線程都可以共享輸入。 – 2012-03-07 19:33:31

+0

所以你的意思是說,重複的數據副本將不需要,仍然通過做一些更改,代碼可以並行化? – user1252852 2012-03-07 19:37:42