【发布时间】:2020-06-19 15:27:38
【问题描述】:
我有以下代码,我想将 omp 添加到:
for ( int i = 0 ; i < N ; i++ ) {
double max2 = 0.;
(calculate max2);
for ( int j = 0 ; j < 3 ; j++) {
int m = group[i].member[j];
if ( members[m].norm < max2 ) {
members[m].norm = max2;
}
}
}
需要保护对成员的访问,但我想使用命名的关键部分,以避免有效序列化该循环的速度损失。我想做的是这样的:
#pragma omp parallel for
for ( int i = 0 ; i < N ; i++ ) {
double max2 = 0.;
(calculate max2);
for ( int j = 0 ; j < 3 ; j++) {
int m = group[i].member[j];
#pragma omp critical (m)
if ( members[m].norm < max2 ) {
members[m].norm = max2;
}
}
}
这样只有真正写入相同 m 值的线程才会相互等待。我的问题是:“m”是用作关键名称的字符串,还是实际评估并将其值用作关键部分的名称?它确实可以编译,但我不知道它是否按照我认为的那样做。如果有人能澄清 omp 在这里做了什么(例如 omp 如何实现这些),我将不胜感激。
非常感谢*。
【问题讨论】:
标签: synchronization openmp thread-synchronization critical-section