поддерживаю выше заданые вопросы
|
Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 02.10.2012 | Доступ: свободный | Студентов: 1754 / 201 | Длительность: 17:47:00
Специальности: Программист
Теги:
Лекция 1:
Математические основы параллельных вычислений
Эквивалентные преобразования программ
(суммирование элементов массива)
s = 0.0; for ( i = 0; i < n; ++i ) s = s + A[ i ];
Информационная зависимость определяет критерий эквивалентности преобразований программ.
Информационная независимость определяет ресурс параллелизма программы.
Перестановка циклов.
#pragma omp parallel for for( i = 0; i < n; ++i) for( = 0; j < m; ++j) A[i][j] = A[i][j–1] + C[i][j]∗x; |
Всегда ли перестановка циклов является эквивалентным преобразованием?
#pragma omp parallel for for( i = 0; i < n; ++i) for( = 0; j < m; ++j) A[i][j] = A[i][j–1] + C[i][j]∗x; |
|
#pragma omp parallel for for( i = 0; i < n; ++i) for( = 0; j < m; ++j) A[i][j] = A[i][j–1] + C[i][j]∗x; |
Распределение циклов.
for( i = 1; i < n; ++i) { 1 A[i] = A[i–1]∗p + q; 2 C[i] = (A[i] + B[i–1])∗s; 3 B[i] = A[i] – B[i])∗t; } |
Утверждение: для того чтобы можно было выполнить распределение цикла необходимо и достаточно, чтобы распределяемые части находились в разных компонентах сильной связности информационного графа тела данного цикла.
for( i = 1; i < n; ++i) { A[i] = A[i–1]∗p + q; C[i] = (A[i] + B[i–1])∗s; B[i] = A[i] – B[i])∗t; } |
for( i = 1; i < n; ++i) { A[i] = A[i–1]∗p + q; #pragma omp parallel for for( i = 1; i < n; ++i) B[i] = A[i] – B[i])*t; #pragma omp parallel for for( i = 1; i ∗ n; ++i) C[i] = (A[i] + B[i–1])∗s; |
Расщепление циклов.
for( i = 501; i <= 2000; ++i) A[i] = A[i] + A[i–500]; |
#pragma omp parallel for for( i = 501; i <= 1000; ++i) #pragma omp parallel for for( i = 1001; i <= 1500; ++i) A[i] = A[i] + A[i–500]; #pragma omp parallel for for( i = 1501; i <= 2000; ++i) A[i] = A[i] + A[i–500]; |
Эквивалентные преобразования программ
Эквивалентно ли преобразование?
for( i = 0; i < n; ++i) D[i] = D[i] ∗ F[i]; if( m == 3 ) for( i = 0; i < n; ++i) R[i] = P[i] + D[i]; else for( = 0; i < n; ++i) R[i] = Q[i] – D[i]; |
if( m == 3 ) for( i = 0; i < n; ++i) R[i] = P[i] + D[i] ∗ F[i]; else for( = 0; i < n; ++i) R[i] = Q[i] – D[i] ∗ F[i]; |
Простой пример…(последовательный вариант)
DO i = 1, n DO j = 1, n U( i + j ) = U( 2∗n – i – j + 1)∗q + p EndDO EndDO
Совсем не простой пример…(параллельный вариант)
DO i = 1, n DO j = 1, n – i Параллельный цикл ! U( i + j ) = U( 2∗n – i – j + 1)∗q + p End DO DO j = n – i + 1, n Параллельный цикл ! U( i + j ) = U( 2∗n – i – j + 1)∗q + p End DO End DO