2016-04-14 31 views
1

我想並行化一段代碼,但有一些問題,插入到共享映射中的關鍵部分在我的執行過程中創建了一個瓶頸。有一種方法可以並行插入?地圖和openMP並行調度

第二個問題涉及如何在預定義次數的映射上迭代openMP。這裏是代碼,我在Clion上使用g ++ - 5。

else if (PERF_ROWS <= MAX_ROWS && function_switch == false) 
{ 
    int array_dist_perf[PERF_ROWS]; 
    int array_dist[MAX_ROWS]; 

    multimap<float, int> temp_map; 

    #pragma omp parallel for schedule(dynamic) private(array_dist_perf) shared(temp_map) 
    for (int i = 0; i < MAX_COLUMNS; i++) 
    { 
     if (i % PERF_CLMN == 1) continue; 

     for (int j = 0; j < PERF_ROWS; j++) //truncation perforation 
     { 
      array_dist_perf[j] = abs(input[j] - input_matrix[j][i]); 
     } 

     float av = mean(PERF_ROWS, array_dist_perf); 

     float temp_score = score_func(av); 

     #pragma omp critical(map_update) 
     temp_map.insert({temp_score, i}); 
    } 

    map<float,int>::reverse_iterator rit; 

    int iter = 0; 

    #pragma omp parallel for schedule(dynamic) private(array_dist) shared(iter) 
    for (rit=temp_map.rbegin(); rit!=temp_map.rend(); rit++) 
    { 
     int s = rit->second; 

     for (int k = 0; k < MAX_ROWS; k++) 
     { 
      array_dist[k] = abs(input[k] - input_matrix[k][s]); 
     } 

     float av_real = mean(MAX_ROWS, array_dist); 

     float score_real = score_func(av_real); 

     rank_function(score_real, s); 

     #pragma omp atomic 
     iter++; 

     if (iter == THRESHOLD_NUM) 

      break; 
    } 
} 
+0

你爲什麼使用'schedule(dynamic)'?您的迭代工作量對我來說似乎沒有太大的變化。 –

+0

另外:你正在執行'提前退出'('break')。你應該使用OpenMP4的'cancel'和'cancellation_point'機制 - 否則你的代碼的行爲是不確定的。 –

+0

我使用時間表(動態)作爲繼續部分,使我跳過一些迭代。我正在使用break,因爲我不知道如何在地圖上迭代任意次數,而不是從開始到結束。 – CIVI89

回答

2

在Open MP 4(它應該由g ++ 5支持)可以定義你自己的約簡。 我不想做一些unneccesarry重複,所以請看看這個答案:C++ OpenMP Parallel For Loop - Alternatives to std::vector

如果我理解你的問題是正確的,你可以使用順序和時間表(靜態,chuncksize),其中CHUNKSIZE是一個線程獲取迭代次數。

+0

問題是我必須使用有序地圖,而不是矢量。 OpenMP似乎無法並行調度有序多映射中的插入,除非我將此操作標記爲關鍵。我也可以爲地圖使用相同的縮小?無論如何,謝謝你的回答。 – CIVI89

+0

它適用於每個類型名單 – Mehno

+0

好吧我理解這個概念,但我實際上不知道如何在地圖中聲明縮減插入。對於第二部分而言,我並不是指每個線程的迭代次數,我只是指地圖上的總迭代次數,以避免中斷。 – CIVI89