2011-04-25 49 views
1

在C中使用schedule(static)並行化循環將意味着塊大小被快速計算爲ceil(loops/threads)C OpenMP - 強制執行默認塊大小

對於我的項目,我必須通過9個不同的塊大小,其中之一是「默認」。我是這樣做的:

我寫了一個perl循環,編譯我的程序-DCHUNKSIZE=$comp代碼我指定schedule(static, CHUNKSIZE)

問題:我能爲默認做些什麼? 0塊大小不工作:(

謝謝!

PS 我希望避免#ifdef ... #else ... #endif因爲我有被並行

回答

2

我EJD同意至於如何處理它,爲什麼不:。

#ifdef CHUNKSIZE 
#pragma omp parallel for schedule(mode, CHUNKSIZE) 
#else 
#pragma omp parallel for schedule(mode) 
#endif 
for (; ;) /* ... */ 

,然後不通過-DCHUNKSIZE作爲默認值。

+0

忘了提及...我有20個循環,並希望避免ifdef/else/endif無處不在 – Mikhail 2011-04-25 19:09:39

+0

@Mikhail Ahhh。我想說默認是1,但我不知道它是否保證是,我必須看看。 – 2011-04-25 19:12:01

+0

它不是1,它實際上計算循環的數量並將其分成線程數 – Mikhail 2011-04-25 19:47:06

1

非常多回路你要離開CHUNKSIZE完全關閉僅僅指定 「計劃(實物)」

+0

你是說不可能自動化默認的塊大小和特定的大小? – Mikhail 2011-04-25 18:56:30

+0

問題是,除了關閉它之外,沒有辦法指定使用默認塊大小。有些實現允許chunksize = 0意味着使用默認值,但其他實現只會將chunksize的值設置爲1(如果您這樣做)。 OpenMP規範不允許。用戶Ninefingers已經展示了一個如何做到這一點的例子。 – ejd 2011-04-25 19:12:53

1
#ifdef CHUNKSIZE 
#define OPM_FOR(mode) _Pragma("omp parallel for schedule(" #mode ", "CHUNKSIZE")") 
#else 
#define OMP_FOR(mode) _Pragma("omp parallel for schedule(" #mode ")") 
#endif 

OMP_FOR(static) 
for (; ;) { /* */ } 

基本上,Æsahættr的解決方案與額外的使用_Pragma()運算符(這是在C99,我相信)。