2015-09-05 54 views
1

我有一個for循環,在每次迭代中訪問許多內存指針。對於每個這些內存指針,我創建了一個索引。我的問題是,當我嘗試使用開放MP並行這個循環中,我得到以下錯誤:是否有可能在C++中使用open mp進行初始化?

錯誤:預期迭代聲明或初始化

我認爲,這個錯誤會是下列之一:

- 打開MP不接受增量不同於++或 - - 打開MP不會在一個循環

有關性能方面的考慮接受多個初始化,使用這些多個索引這對我很重要。有人知道我的問題的答案嗎?

這是代碼:

#pragma omp parallel default(shared) 
{ 
    int tID = omp_get_thread_num(); 
    int i, iCF, iPF, iNF, iPJG, iCJG, iNJG, iPRJG, iCRJG; 

    ##pragma omp for nowait 
    for(i=0, iCF=0, iPF=0, iNF=sqrBcksDim, iPJG=0, iCJG=0, iNJG=sqrBcksSize, iPRJG=0, iCRJG=0 ; iCF<RHSArraySize ; iPF=iCF, iCF=iNF, iNF+=sqrBcksDim, iPJG=iCJG, iCJG=iNJG, iNJG+=sqrBcksSize, iPRJG=iCRJG, iCRJG+=rectBcksSize, ++i) 
    { 
    } 
} 
+1

有關C++中'for'循環中合法內容的OpenMP規則在本規範的第40頁中:http://www.openmp.org/mp-documents/OpenMP3.1.pdf。最簡潔的答案是不。 – Davislor

回答

1

好了,看着那第三條,你做了很多依賴於程序狀態下的前一次迭代結束固有的順序計算的循環。你可以移動所有這些操作,但循環體內部的+ =和++更新,以及從外觀看可能會使循環條件依賴於iNF,是正確的?但其中一些看起來像他們仍然可能是ordered。對於一個並行算法,你可以在循環體內使用封閉形式的初始化器,它只依賴於i或者什麼東西是循環不變的?

如果不是,並輸入到每個迭代確實取決於循環的先前重複的結果,那麼它是不是一個並行算法

一個建議:

下面是我想嘗試解決這個問題。你只能初始化i並在循環內增加一個常數;但是,您可以等效地將的所有其他操作移動到的循環中。例如,我不知道在循環體內還有什麼,但是如果iCF初始化爲0,iNFsqrBcksDim並且在每次迭代結束時,iCF被設置爲之前的值iNF並且iNF被遞增sqrBcksDim,它看起來像你可以重寫環路成類似:

int i; 

#pragma omp for nowait 
for (i=0; i < RHSArraySize/sqrBcksDim; ++i) 
{ 
    const int iCF = i*sqrBcksDim; 
    const int iNF = iCF + sqrBcksDim; 
    // ... 
} 

你能做到你的其他變量?如果你真的有一個並行算法,你應該可以這樣做,因爲循環的每個運行只應依賴於i和循環不變量,你可以在初始化程序中使用它。如果你要在循環體外引用它,你需要在循環外部聲明一個變量,但是暫時只需聲明一個新的局部變量,並且不要在循環外部讀取任何變量你也寫在循環裏面。如果沒有隱式順序依賴性,則應該能夠在循環體的開始處全部初始化它們。

你可能不會這樣做,但它可能會幫助你考慮如何重構。

+1

是的,這個想法很有效。事實證明,我使用這些參數創建了一個類,以便每個內核通過其線程ID訪問其參數。感謝你們 – ISMSL

相關問題