У меня есть следующий фрагмент кода, для которого я хочу добавить 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;
}
}
}
Доступ к членам должен быть защищен, но я хотел бы использовать именованный критический раздел, чтобы избежать потеря скорости эффективной сериализации этого l oop. Я хочу сделать следующее:
#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 это реализует).
Большое спасибо.