zhelaevdenis / Parallel-Programming

My labs with graphics
0 stars 0 forks source link

Вопросы lw6 #6

Open ReactiveTurtle opened 3 months ago

ReactiveTurtle commented 3 months ago

https://github.com/zhelaevdenis/Parallel-Programming/blob/dd332cf8826929668087c119c304ca986f375aae/lw6/ParalelForAtomic/ParalelForAtomic/ParalelForAtomic.cpp#L5 Ответить на вопросы из лабораторной

zhelaevdenis commented 3 months ago
  1. Рассказать про for, reduction, parallel, atomic. Ответ:

    pragma omp for используется для распределения цикла между доступными потоками

    pragma omp parallel распределяет следующий блок кода между доступными потоками, не обязательно работает с циклом

    Часто эти две директивы работают вместе

    pragma omp atomic - выполняет действие атомарно, те есть без прерываний других потоков.

    pragma omp reduction - выполняет действие над всеми частными результатами полученными в параллельных потоках. В лабораторной по-сути складывает все значения в одно.

3.Записать время выполнения вариантов программ и сравнить. Объяснить различия во времени выполнения при использовании различных вариантов (reduction, atomic и т.д. см. в задании).

Время записано в readme каждой программы, самое эффективное с использованием reduction, тк там идёт большое количество частных результатов которые нужно складывать и атомарное складывание медленнее? (немного не уверен, что правильно сделал выводы) Задание 2 Необходимо объяснить разницу между private(x), firstprivate(x) и lastprivate(x) на примере ниже. Писал в readme SecondApp, дублирую здесь:

private(x) - директива, которая создаёт свою локальную переменную х в каждом параллельном регионе. К локальной переменной другие потоки не могут обратиться, как и видеть её изменения. Если переменную не определить, то она останется неопределённой. В приведенном коде будет выводится каждый номер потока и номер операции из цикла, но в конце будет выводится заранее заданное число 44, на которое потоки не будут влиять.

firstprivate(x) - директива, которая создаёт копию оригинального х, но инициализирует её отдельно в каждом потоке. Так же не изменения не отслеживаются, обратиться к копии нельзя. В приведенном коде будет выводится каждый номер потока и номер операции из цикла, но в конце будет выводится заранее заданное число 44, на которое потоки не будут влиять.

lastprivate(x) - директива которая создаёт копию оригинального х. В конце в переменную х сохраняются результаты изменения последнего действия цикла. В приведенном коде выводится каждый номер потока и номер операции из цикла, но в конце будет выводится 10, тк это последняя операция над числом в цикле. код из примера: int main() { int x = 44;

pragma omp parallel for private(x)

for(int i = 0; i <= 10; i++){
    x=i;
    printf("Thread number: %d x: %d\n",omp_get_thread_num(),x);
}
printf("x is %d\n", x);

}

ReactiveTurtle commented 3 months ago

Принято