Главная /
Параллельное программирование с OpenMP /
Найдите ошибку в следующем фрагменте программы: int x=0; omp_lock_t lcka, lckb; omp_init_lock (&lcka); omp_init_lock (&lckb); #pragma omp parallel { int iam=omp_get_thread_num(); if (iam ==0) { omp_set_lock (&lcka); omp_set_lock (&lckb); x
Найдите ошибку в следующем фрагменте программы:
int x=0;
omp_lock_t lcka, lckb;
omp_init_lock (&lcka);
omp_init_lock (&lckb);
#pragma omp parallel
{
int iam=omp_get_thread_num();
if (iam ==0) {
omp_set_lock (&lcka);
omp_set_lock (&lckb);
x = x + 1;
omp_unset_lock (&lckb);
omp_unset_lock (&lcka);
} else {
omp_set_lock (&lckb);
omp_set_lock (&lcka);
x = x + 2;
omp_unset_lock (&lcka);
omp_unset_lock (&lckb);
}
}
}
omp_destroy_lock (&lcka);
omp_destroy_lock (&lckb);
вопрос
Правильный ответ:
после установки блокировки в результате вызова функции
omp_set_lock(&lcka)
, повторное обращение нитью к функции omp_set_lock(&lckb)
некорректно (повторное обращение omp_set_lock(&lckb)
должно быть заменено на omp_set_nest_lock(&lckb)
)
дедлок - взаимная блокировка нитей, возникающая, в случае если master-нить, выполнила
omp_set_lock (&lcka)
, а другая нить выполнила omp_set_lock (&lckb)
в данном фрагменте программы ошибки нет
Сложность вопроса
75
Сложность курса: Параллельное программирование с OpenMP
28
Оценить вопрос
Комментарии:
Аноним
Зачёт прошёл. Мчусь пить отмечать халяву с тестами интуит
22 дек 2020
Аноним
Очень сложные тесты
05 май 2020
Другие ответы на вопросы из темы программирование интуит.
- # Процессорная модель консистентности памяти определяется следующим условием:
- # Найдите ошибку в следующем фрагменте программы: #define N 10 int i; #pragma omp parallel { int tmp = 0; #pragma omp for private(tmp) for (i=0; i<N; i++) { tmp += i; } }
- # Рассмотрим фрагмент OpenMP-программы: #include <omp.h> int n=1; int main (void) { omp_set_nested(1); omp_set_dynamic(1); omp_set_num_threads(2); #pragma omp parallel if (n>10) {/*параллельная область*/ … } } Для выполнения параллельной области будет создана группа нитей, состоящая из:
- # Найдите ошибку в следующем фрагменте программы: int i, j; #pragma omp parallel default(shared) { #pragma omp for collapse (3) for (i=0; i<n; i++) { for (j=0; j < n; j++) work(i, j); } }
- # Найдите ошибку в следующем фрагменте программы: #define N 10 int A[N],B[N], sum; #pragma omp parallel default(shared) num_threads(10) { int iam=omp_get_thread_num(); if (iam ==0) { #pragma omp critical (update_a) #pragma omp critical (update_b) sum +=A[iam]; } else { #pragma omp critical (update_b) #pragma omp critical (update_a) sum +=B[iam]; } }