Я использую OpenMP на вложенном цикле, который работает как этотзамена #pragma OMP критической (C++)
#pragma omp parallel shared(vector1) private(i,j)
{
#pragma omp for schedule(dynamic)
for (i = 0; i < vector1.size(); ++i){
//some code here
for (j = 0; j < vector1.size(); ++j){
//some other code goes here
#pragma omp critical
A+=B;
}
C +=A;
}
}
Проблема здесь состоит в том, что мой код делает много вычислений в A+=B
части код. Поэтому, делая это критическим, я не достигаю ускорения, которое я бы хотел. (На самом деле, как представляется, некоторые накладные расходы, так как моя программа занимает больше времени, чтобы выполнить ее, она записывается последовательно).
Я попытался с помощью
#pragma omp reduction private(B) reduction(+:A)
A+=B
это ускоряет время выполнения, однако, кажется, что он не заботится о гоночных условиях, как п critical
, так как я не получаю те же результаты А.
Есть ли альтернатива этому, я могу попробовать?
Есть одна вещь, которую вы можете сделать: опубликуйте [минимальный, полный и проверяемый пример] (http://stackoverflow.com/help/mcve), потому что только с вашим псевдокодом мы мало что можем сделать, чтобы помочь вам , – Gilles
Возможно, вы правы, но в то же время сокращение() не заботится о гоночных условиях? –
Конечно, это так, вы знаете, что делают «критические» и «сокращения»? Кажется, вы случайно применяете идеи, которые полностью меняют смысл программы. 'A' и' B' не определены, поэтому совершенно невозможно догадаться, что вы имеете в виду под этим фрагментом. Нет такой вещи, как «прагма, заботясь о состоянии гонки», это ручная работа, вы несете ответственность за структурирование кода, чтобы они не появлялись. То есть ничто не заботится об этом, они гарантированно не появятся. – luk32