Я просмотрел официальные определения, но я все еще довольно смущен.Как firstprivate и lastprivate отличаются от частных предложений в OpenMP?
firstprivate
: Указывает, что каждый поток должен иметь свой собственный экземпляр переменной, и что переменная должна быть инициализирована со значением переменной, так как она существует до параллельной конструкции.
Для меня это звучит очень похоже на личное. Я искал примеры, но, похоже, я не понимаю, как это особенно или как его можно использовать.
lastprivate
: Указывает, что версия контексте вшита в переменной устанавливается равной частной версии от какой нить выполняет последней итерации (для цикла конструкт) или последнюю секцию (#pragma секции).
Я чувствую, как я понимаю, это один немного лучше, так как в следующем примере:
#pragma omp parallel
{
#pragma omp for lastprivate(i)
for (i=0; i<n-1; i++)
a[i] = b[i] + b[i+1];
}
a[i]=b[i];
Таким образом, в этом примере, я понимаю, что lastprivate
позволяет i
быть возвращены вне цикла как последнее значение было.
Я только начал изучать OpenMP сегодня.
Это отличный ответ! Большое спасибо! – SaiyanGirl
Ну, я бы сказал, что 'firstprivate' и' lastprivate' являются ОЧЕНЬ особыми случаями 'private'. Обычно вам даже не нужно использовать 'private' (просто определите переменную внутри параллельного блока), возможно, затеняя внешнюю область. Интересным является использование объектов C++ в качестве автоматических переменных 'firstprivate' - они будут инициализированы путем создания копии, один раз и уничтожены после блока, и вам не нужно знать количество потоков заранее - так как многие копии будут при необходимости создаваться. –
Такой отличный пример! Нравится это больше всего. Цените Христо. – Fusionmate