[英]OpenMP race conditions with conditional statement
我正在嘗試並行處理一段代碼,我已經解決了通過歸約並行分配地圖中插入的問題。 但是該程序給了我一個內存錯誤,我認為這與對地圖大小的條件檢查有關。 存在概念錯誤,或者是否也可以同步該部分?
if (PERF_ROWS == MAX_ROWS)
{
int array_dist[PERF_ROWS];
#pragma omp declare reduction (merge : std::multimap<float, int> : omp_out.insert(omp_in.begin(),omp_in.end()))
#pragma omp parallel for schedule(dynamic) reduction(merge: ranking_map) private(array_dist)
for (int i = 0; i < MAX_COLUMNS; i++)
{
if (i % PERF_CLMN == 1) continue;
for (int j = 0; j < PERF_ROWS; j++)
{
array_dist[j] = abs(input[j] - input_matrix[j][i]);
}
float av = mean(PERF_ROWS, array_dist);
float score = score_func(av);
//cout<<score<<" "<<av<<endl;
//#pragma omp critical(rank_func)
//rank_function(score, i);
multimap<float,int>::iterator it = ranking_map.begin();
if (ranking_map.size() < NUM_RES)
{
ranking_map.insert({score, i});
}
else if (score > it -> first)
{
ranking_map.erase(it);
ranking_map.insert({score, i});
}
}
好吧,定義自己的組合器。 創建一個名為insertwhatever的函數,並編寫如下代碼:
void insertwhatever(std::multimap<float, int>& a, std::multimap<float, int>&b)
{
for(auto iterb : b)
{
if(a.size() < NUM_RES)
{
a.insert(iterb);
}
else if(....)
{
(dont know what you want to do here)
}
}
}
然后改變減少
#pragma omp declare reduction (merge : std::multimap<float, int> : insertwhatever(omp_out,omp_in))
我不太確定,但是我認為這應該起作用。 我還是不太了解您到底想做什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.