Имеет ли ключевое слово «общий доступ» предотвратить условия гонки?

Мне неясно, что делает «shared» в openMP. Я вижу, что спекуляция заявляет, что общий доступ «объявляет один или несколько элементов списка для совместного использования задачами», но мне это кажется неясным.

Например, если у меня есть следующий код:

    #pragma omp parallel for shared(num1)
for(i=0; i<m; i++) {
for(j=0; j < n; j++) {
if(myFunc(i,j) < 0) {
num1 += 256*u(i,j);
}
}
}

Остановит ли это условия гонки с num1 и даст ли точный результат в конце цикла for? Если нет, что именно это делает?

1

Решение

Остановит ли это условия гонки?

Нет не будет:

Программист несет ответственность за то, чтобы несколько потоков правильно обращались к переменным SHARED (например, через разделы CRITICAL).

Общий раздел просто делает одну и ту же переменную видимой из нескольких потоков.

Вы можете использовать критические секции или атомарный доступ для синхронизации, но в этот если тебе лучше использовать сокращение пункт:

#pragma omp parallel for reduction(+:num1)
0

Другие решения

Других решений пока нет …