コードを並列化しようとしていますが、マップ内の挿入を並列にディスパッチするという問題を解決しました。しかし、プログラムは私に私がマップサイズの条件付きチェックに関連すると思うメモリエラーを与える。概念的なエラーがありますか、その部分も同期することは可能ですか?条件文を使用したOpenMP競合条件
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});
}
}
OpenMPを無効にしてコードを試したことがありますか、または1つのスレッドを使用しましたか? – user0815
はい、動作しますが、問題はopenmpでパフォーマンスが低下することです。私はマップ内の挿入をパラレルにディスパッチするという問題を解決しましたが、条件付き部分を並列化するために何をすべきか分かりませんし、コードをボトルネックにすることは避けています。 – CIVI89
あなたが達成しようとしているものが分からないと、それを伝えるのは難しいです。しかし、 'ranking_map'の操作は、各スレッドがプライベートコピーを使用するので安全です。それに応じて、複数のスレッドで実行するために 'NUM_RES'などの変数を変更しましたか? 'NUM_RES'はどのように初期化されていますか? – user0815