2015-01-03 41 views
1

我需要一些幫助來理解下面描述的代碼的關鍵部分,特別是我如何使用std::map是線程安全的。C++ - OpenMP任務 - 地圖插入,關鍵?

我一行一行地加載一個文件,從內容中構建一個字符串,然後每隔一段時間到達一個分隔符。在此分隔符上,我創建一個std::map鍵/值對,並創建一個任務以對此值進行操作(請參見下文)。這個值是一對,第一個是管家int,第二個是uint64_t的矢量。

#pragma omp parallel num_threads(4) 
#pragma omp single 
{ 
    while (getline(fin, line) && ...) 
    { 
     if (line[0] == '>') 
     { 
      #pragma omp task 
      do_work_on_value(tmp, map[key]) 

      tmp.clear(); 

      // insert map entry (new key!) 
      map.insert(...); 
     } 
     else 
      tmp += line; 
    } 
} 

... 

static void do_work_on_value(string vals, pair<int, vector<uint64_t>> &val) 
{ 
    ... 
} 

所以,關鍵的操作是:

  • 添加新的鍵/值對,而在不同的值
  • 上的值的矢量(push_back和一些算術/按位上的工作運行內容)

我使用this answer瞭解了一些OpenMP指令,是否足夠使用#pragma omp criticalmap.insert?每項任務將以獨特的鑰匙價值運作,所以我不相信我需要做更多。

提前歡呼!


@Gilad感謝你的鏈接到YouTube的英特爾OpenMP的教程,

這些都是具體的相關視頻 -

Introduction to tasks and examples

Discussion of tasks in linked list example

+1

請檢查這個偉大的播放列表由英特爾https://www.youtube.com/playlist?list=PLLX-Q6B8xqZ8n8bwjGdzBJ25X2utwnoEG – Gilad

回答

0

使用鏈接英特爾OpenMP的教程在@Gilad的評論中,很明顯沒有問題,假設沒有關鍵字du就派遣任務即使在任務的父母範圍內也會產生衝突/關鍵區域。用於該任務的最終代碼沿着以下線:

#pragma omp task firstprivate(tmp), if (large tmp), untied 
do_work_on_value(tmp, map[key]) 

表現很差,不幸的是,我會繼續嘗試。