2016-11-18 96 views
2

訪問向量I具有矩陣:計算/使用並行編程C++

std::vector<std::vector<double> >* p_mat_cache = 
    new std::vector<std::vector<double> >(3, std::vector<double>()); 

和向量​​:

std::vector<double>* p_val_vec_1 = new std::vector<double>(*mpStages); 

其中 'mpStages' 是一個int值。在某一點上,我應用了以下情況的功能:

pMatCache->at(1).push_back((*pValVec1)[j+1]); 
pMatCache->at(2).push_back((*pValVec1)[j]); 

(*pValVec2)[j] = fmax(*mpK - CalculateS(i, j), *mpD *(0.5 * (*pValVec1)[j+1] + 
         0.5*(*pValVec1)[j])); 

pMatCache->at(0).push_back((*pValVec2)[j]); 

pValVec1和pMatCache對應於本地名稱。 pValVec2是長度爲'mpStages-1'的另一個向量。 「計算」是如下:

double AbstractOptionSolver::CalculateS(int n, int i) 
{ 
    return pow(*mpUp,i) * pow(*mpDown, n-i) * *mpS; 
} 

其中私有變量「*國會議員」,「* mpUp」和「* mpDown」不代碼的執行過程中發生改變。我所試圖做的是運行的這種並行的一部分,我認爲可以按以下步驟進行:

#pragma omp parallel 
{ 
    pMatCache->at(1).push_back((*pValVec1)[j+1]); 
    pMatCache->at(2).push_back((*pValVec1)[j]); 

    (*pValVec2)[j] = fmax(*mpK - CalculateS(i, j), *mpD *(0.5 * (*pValVec1)[j+1] + 
          0.5*(*pValVec1)[j])); 
} 

pMatCache->at(0).push_back((*pValVec2)[j]); 

但是這個代碼不斷,甚至當我只是有OMP崩潰,由於除了「OMP並行」的平行,只包括推回。想知道是否有人知道爲什麼會發生這種情況?

我也試圖進一步瞭解並行編程,以瞭解何時/何時我不能在一個函數中使用它,因爲某些函數有時會使某些方面並行導致此代碼崩潰,原因不明。如果有人有任何消息來源幫助我解決這個問題,那將會很棒。

+0

這裏的比賽條件 –

+0

即使我只是在矩陣@appleapple的兩個不同位置應用推回? – mwtmurphy

回答

0

首先,#pragma omp parallel只會在那一點產生一堆線程,它將在作用域部分做完全相同的操作,它不會爲每個線程分配一個唯一的j或i。您可能想要查看http://bisqwit.iki.fi/story/howto/openmp/#ParallelismConditionalityClauseIf以瞭解如何基於索引進行並行化。但是鑑於代碼片段很難準確地告訴你想要做什麼。

下一個最大的問題是,你會有多個線程同時調用.push_back。您需要預先分配並分配值。

我不知道你爲什麼使用std :: vector指針和新語法。通常使用帶RAII的向量,並避免新的/刪除調用。

+0

我已經在問題中提供了我想要做的事情,用兩段不同的代碼顯示我在哪裏以及我想要感知的內容。我會看看鏈接,看看它是否給了我更好的見解。 此外,我使用新的語法,因爲這些向量位於一個方法中,該方法是可能不會被刪除的對象的一部分,但是可以使用重複數千到數十萬次的方法進行編輯。因此,我會遇到分配錯誤,建立沒有新/刪除語法的向量 – mwtmurphy

+0

主要是我被#pragma omp並行部分的代碼片斷困惑。從你發佈的內容看,你似乎試圖並行化單個push_back語句,這是行不通的。但是,如果線程執行更多操作並預先分配了緩衝區,則應該能夠對整個代碼進行並行處理,但如果不知道發佈的代碼段之外發生了什麼,則無法分辨。 – aah

+0

我試圖並行化推回和矢量計算,所有信息都已知,並且在讀/寫中沒有重疊。它只是不起作用?還是有沒有理由不工作?如果我不得不預先分配然後分配值,那麼考慮到我不知道在這個矩陣中有多少列,試圖嘗試對這部分進行並行化確實沒有意義?爲了向你展示這個函數之外發生了什麼是不可能的,因爲它是一個包含多個交互類的大型項目的一部分。這將是一個巨大的代碼顯示。 – mwtmurphy

0

在進行並行編程時,您必須注意「鎖定數據」。此技術可防止兩個(或更多)線程同時修改相同的數據,從而破壞它。

+0

並行for循環修改相同的向量/矩陣內的數據已爲我工作。爲什麼它會在此之外應用鎖定? – mwtmurphy

+0

而不是理論,我會嘗試設置鎖,以檢查鎖是否解決崩潰。 – Ripi2

+0

會試一試。感謝幫助。 – mwtmurphy