2010-01-21 71 views
7

我剛開始學習如何使用OpenMP。我想弄清楚爲什麼下面的代碼不能與Visual Studio 2008並行運行。它編譯並運行正常。但是它在我的四核機器上只使用了一個核心。這是我嘗試移植到mex函數的代碼的一部分。任何指針讚賞。試圖知道爲什麼OpenMP代碼不併行

#pragma omp parallel for default(shared) private(dz, t, v, ts_count) reduction(+: sum_v) 
for(t = 0; t<T; t++) 
{ 
    dz = aRNG->randn(); 
    v += mrdt* (tv - v) + 
     vv_v_sqrt_dt * dz + 
     vv_vv_v_dt*(dz*dz - 1.); 

    sum_v += v; 
    if(t == ts_count-1) 
    { 
     int_v->at_w(k++) = sum_v/(double)(t+1); 
     ts_count += ts; 
    } 
} 

回答

4

變量v使用前一次迭代

for(t = 0; t<T; t++) { 
    ... 
    v += ... (tv - v) .... 
    ... 
    } 

你不能做到這一點的V值計算的,它打破了並行性。該循環必須能夠以任何順序運行,或者一次運行不同的並行塊​​,而沒有副作用。 乍一看,它看起來並不像你可以並行化這種循環。

+0

你也應該考慮一下循環內的隨機數生成器的一些問題。根據它的實現,這可能會鎖定共享資源,如果解決了上述問題,則可以有效地序列化代碼。 – 2010-01-23 15:33:48

0

我也不太清楚,它一直以來我使用OpenMP的很長一段時間,但你必須在循環變量t設置爲私人。那是你要的嗎?這不是平行化變量嗎?

0

一種可能性是您正在使用「sum_v」變量。由於您正在執行縮減操作,因此運行時可能只會在其中累積值,並且只有在循環完成後才能「正常」訪問它。