почему являетсяi
приватным и не поделили?
Переменные i
и j
являются частными для каждого потока, поскольку они являются счетчиками циклов. Каждый поток должен отслеживать, что он делает, отдельно от других потоков. Если i
или j
были разделены между потоками, то каждый поток обновлял их и путался с выполнением других потоков.
Если у меня есть 4 потока, поэтому каждый поток выполняет один и тот же код, я не понимаю, как получить тот же результат, что и последовательный код?
Каждый поток выполняет те же строки кода, но использует разные переменные. Директива OpenMP 'for' помогает автоматически распределять итерации между потоками, так что каждый поток получает другое начальное значение i
и другое конечное значение в цикле for
. Таким образом, это больше похоже на то, что каждый поток получает тот же код внутри цикл, но различную инициализацию и конечное условие цикла. Все они вместе (если запрограммировано правильно) дают тот же конечный результат, что и последовательная реализация.
Конечно, для этого необходимо, чтобы цикл был параллелизуемым. Если каждая итерация цикла зависит от результатов, вычисленных предыдущими итерациями, то он не может выполняться параллельно. В этом случае вам потребуется переписать цикл, чтобы каждая итерация выполнялась независимо.
Я имею в виду, что конечный результат будет одинаковым в обеих ситуациях: (1) последовательная реализация; (2) каждый поток выполняет набор итераций. –
Однако ваш пример не является параллелизуемым, и результат запуска вашей программы не определен (думаю: «Если я изменил порядок выполнения итераций, изменится ли результат?»). Пример, который будет работать: #pragma omp parallel для private (i, j) shared (A, n) {for (i = 0; i
Я не понимаю вас очень хорошо, но, спасибо. – David