2015-01-26 5 views
2

Я начинаю в OpenMP, и я хочу распараллелить эту часть кода:мне нужна помощь, чтобы понять этот пример OpenMP

for (i=0 ;i<n ;i++) 
    for (j=1 ;j<n ;j++) 
     A[i][j]+=A[i][j-1]; 

и я нахожу этот ответ:

#pragma omp parallel for private(i, j) shared(A, n) 
for (i = 0; i < n; ++i) 
    for (j = 1; j < n; ++j) 
    A[i][j] += A[i][j-1]; 

У меня есть несколько вопросов:

  • Почему i частный и не общий?
  • об этом ответе, если у меня есть 4 потока, поэтому каждый поток выполняет тот же код, я не понимаю, как я могу получить такой же результат, как последовательный код?

Как нитки решают эту задачу? Мне нужна ваша помощь.

ответ

1

почему являетсяi приватным и не поделили?

Переменные i и j являются частными для каждого потока, поскольку они являются счетчиками циклов. Каждый поток должен отслеживать, что он делает, отдельно от других потоков. Если i или j были разделены между потоками, то каждый поток обновлял их и путался с выполнением других потоков.

Если у меня есть 4 потока, поэтому каждый поток выполняет один и тот же код, я не понимаю, как получить тот же результат, что и последовательный код?

Каждый поток выполняет те же строки кода, но использует разные переменные. Директива OpenMP 'for' помогает автоматически распределять итерации между потоками, так что каждый поток получает другое начальное значение i и другое конечное значение в цикле for. Таким образом, это больше похоже на то, что каждый поток получает тот же код внутри цикл, но различную инициализацию и конечное условие цикла. Все они вместе (если запрограммировано правильно) дают тот же конечный результат, что и последовательная реализация.

Конечно, для этого необходимо, чтобы цикл был параллелизуемым. Если каждая итерация цикла зависит от результатов, вычисленных предыдущими итерациями, то он не может выполняться параллельно. В этом случае вам потребуется переписать цикл, чтобы каждая итерация выполнялась независимо.

+0

Я имею в виду, что конечный результат будет одинаковым в обеих ситуациях: (1) последовательная реализация; (2) каждый поток выполняет набор итераций. –

+0

Однако ваш пример не является параллелизуемым, и результат запуска вашей программы не определен (думаю: «Если я изменил порядок выполнения итераций, изменится ли результат?»). Пример, который будет работать: #pragma omp parallel для private (i, j) shared (A, n) {for (i = 0; i

+0

Я не понимаю вас очень хорошо, но, спасибо. – David

Смежные вопросы