Я пытаюсь распараллелить эти циклы свертывания с openMP, но вот что я получил: "smooth.c: 47: 6: ошибка: недостаточно идеально вложенных циклов перед" sum "’ sum = 0; "
Вы не можете свернуть три уровня цикла, потому что третий уровень не полностью вложен во второй. Есть
sum = 0;
до него и
smooth(y, x) = sum / 9;
после него в средней петле. (Полагаю, smooth()
- это макрос, иначе назначение не имеет смысла. Но не делайте этого, потому что это сбивает с толку.)
Подумайте, как бы вы переписали это гнездо цикла в эквивалентный отдельный цикл вручную, используя свои знания о структуре проблемы и ее деталях. Я утверждаю, что это было бы сложно сделать, и что результат, кроме того, будет иметь неизбежные зависимости данных. Но если вам удалось сделать это без введения зависимостей, то вуаля! У вас есть одна плоская петля для распараллеливания, не требуется свертывание.
Однако самым простым способом продвижения вперед, вероятно, было бы падение только двух уровней вместо трех. Более того, вы хотите сравнить с отсутствием коллапса вообще, поскольку не совсем понятно, что коллапс даст улучшение по сравнению с распараллеливанием только внешнего цикла, и коллапс может быть даже хуже .
Но если вам нужно, чтобы OpenMP свернул все три уровня гнезда, то вам нужно взять две строки, которые я назвал выше, и вынуть их из гнезда петли. Возможно, вы могли бы сделать это частично, полностью избавившись от sum
и работая непосредственно с результирующим растром. Опять же, это не обязательно приведет к улучшению.