2013-04-07 71 views
0

我有一個簡單的程序,它生成(使用Boost)一些初始速度和位置,並計算傳播一定距離所花費的時間。基於橫向距離(x, y),將最終軸向(z)速度添加到矢量。下面是簡單的程序:簡單的程序在並行化後不工作

#include <iostream> 
#include <boost/random.hpp> 
#include <boost/random/normal_distribution.hpp> 

using namespace std; 




int main() 
{ 

    boost::mt19937 engine(static_cast<unsigned int>(time(0))); 


    boost::normal_distribution<double> nd(0.0, 1.0); 
    boost::variate_generator< boost::mt19937, boost::normal_distribution<double> > normal_std_one(engine, nd); 






    double coordX, coordY, coordZ, time; 
    double velX, velY, velZ; 

    const double factor = 0.01; 
    const double distance = 15.0; 

    vector<double> cont; 

    int i; 
    for(i=0; i<1000000000; i++) 
    { 
     coordX = factor*normal_std_one(); 
     coordY = factor*normal_std_one(); 
     coordZ = 0.0; 


     velX = normal_std_one(); 
     velY = normal_std_one(); 
     velZ = 20.0*normal_std_one()+300; 



     time = distance/velZ; 

     coordX += velX*time; 
     coordY += velY*time; 

     if(sqrt(coordX*coordX + coordY*coordY) < 0.02) 
     { 
      cont.push_back(velZ); 
     } 
    } 
    cout << cont.size() << endl; 


    return 0; 
} 

我想到了一個很好的補充將使用OpenMP並行化for -loop。這是我做的,加入循環開始之前以下行:

#pragma omp parallel for 

另外,我已經加入到-fopenmp編譯器選項和`-fopenmp *的鏈接器設置。我的程序編譯並沒有錯誤鏈接,但是當我執行這個文件我得到的消息:

Process terminated with status -1073741819 (0 minutes, 2 seconds) 

我做了什麼錯在這裏是我不清楚。我使用Windows和g ++(通過Code :: Blocks IDE)。

+0

您有多個線程正在同時嘗試更新「cont」狀態... – 2013-04-07 10:52:15

+0

@OliCharlesworth因此,如果使用向量,那麼使用OpenMP是不可能的? – BillyJean 2013-04-07 10:54:05

+0

如果將它替換爲cont.push_back [i] = velZ,它會有什麼區別嗎? ? – SChepurin 2013-04-07 11:17:18

回答

1

我張貼這個答案,但不是評論只是爲了積累結果,並避免長長的評論列表。它適用於來自Microsoft PPL的parallel_for,如果您正確處理std:vector的大小以避免out-of-range異常。但問題是,當i超過~20000時,boost::variate_generator無法處理多個請求,並在程序崩潰時產生APPLICATION_FAULT_INVALID_POINTER_READ錯誤。

更新:當不使用boost::variate_generator(簡單地將值分配給矢量的索引)上的雙核筆記本它運行沒有錯誤,但示出了相反到預期的結果 - 順序代碼運行速度比與多線程parallel_for

0

您不能在多個線程間使用不同步的cont.push_back。它不是線程安全的。您需要使用不同的容器,或者在訪問時使用某種互斥鎖。如果重要的話,您可能還需要做一些事情來維護它們進入容器的順序。

+0

訂單沒有任何關係。你的建議是什麼?我是OpenMP的初學者。 – BillyJean 2013-04-07 10:58:47

+0

我試圖通過添加'#pragma omp critical'來使其成爲關鍵部分,但現在我得到消息'「內存不能在執行時被讀取 – BillyJean 2013-04-07 11:27:32