courses:high_performance_computing:questions
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| courses:high_performance_computing:questions [2016/10/31 01:21] – created kel | courses:high_performance_computing:questions [2016/11/24 00:07] (current) – kel | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Вопросы к проверке знаний ====== | ====== Вопросы к проверке знаний ====== | ||
| + | ===== 1. Уровни абстракции технологий ===== | ||
| + | Расположите в порядке увеличения степени абстракции технологии высокопроизводительных вычислений: | ||
| + | - OS Threads, SSE/MMX, C++11 Threads/ | ||
| + | - SSE/MMX, OS Threads, TBB/ | ||
| + | - SSE/MMX, OS Threads, C++11 Threads/ | ||
| + | - OS Threads, TBB/ | ||
| + | |||
| + | ===== 2. Закон Амдала ===== | ||
| + | Что показывает закон Амдала: | ||
| + | - Прирост производительности в зависимости от доли последовательного кода и числа вычислительных элементов | ||
| + | - Прирост производительности в зависимости от числа вычислительных элементов и используемой технологии распараллеливания | ||
| + | - Число вычислительных элементов, | ||
| + | - Долю последовательного кода, производительность которого невозможно повысить | ||
| + | |||
| + | ===== 3. Завершение потоков ===== | ||
| + | Как называются функции, | ||
| + | - Функции завершения потока | ||
| + | - join-функции | ||
| + | - Cancellation / interruption points | ||
| + | - Signal handlers | ||
| + | |||
| + | ===== 4. Spin mutex ===== | ||
| + | Чем отличается spin mutex от обычного mutex: | ||
| + | - Остаётся всегда в user space | ||
| + | - Остаётся всегда в kernel space | ||
| + | - Ничем не отличается | ||
| + | - Позволяет читателям производить операции параллельно | ||
| + | |||
| + | ===== 5. Wait/notify ===== | ||
| + | В каком состоянии находится примитив синхронизации (mutex) в приведённом коде на 1, 3 и 4 строках: | ||
| + | <code c++> | ||
| + | 0: boost:: | ||
| + | 1: | ||
| + | 2: while (messageQueue.empty()) | ||
| + | 3: | ||
| + | 4: | ||
| + | </ | ||
| + | - Во всех строках захвачен | ||
| + | - Во всех строках освобождён | ||
| + | - Захвачен в 1 и 4 строках, | ||
| + | - Захвачен в 1 строке, | ||
| + | |||
| + | ===== 6. Ранжирование алгоритмов ===== | ||
| + | Расположите алгоритмы синхронизации в порядке увеличения потенциальной производительности в жёсткой конкурентной среде: | ||
| + | - Грубая, | ||
| + | - Тонкая, | ||
| + | - Неблокирующая, | ||
| + | - Грубая, | ||
| + | |||
| + | ===== 7. Выбор алгоритма ===== | ||
| + | Отметьте вид алгоритмов синхронизации, | ||
| + | - Грубая | ||
| + | - Тонкая | ||
| + | - Оптимистичная | ||
| + | - Неблокирующая | ||
| + | |||
| + | ===== 8. Wait-free алгоритм ===== | ||
| + | Выберите корректное определение wait-free класса алгоритмов: | ||
| + | - Любой поток ожидает, | ||
| + | - Любой поток может выполнить свои функции за конечное число шагов, если ни один другой поток не находится в критической секции | ||
| + | - Система в целом продвигается вперед не зависимо ни от чего | ||
| + | - Любой поток может выполнить свои функции за конечное число шагов, не зависимо ни от чего | ||
| + | |||
| + | ===== 9. Определение типа ошибки ===== | ||
| + | Какая ошибка потенциально может возникнуть в приведённом коде: | ||
| + | <code c++> | ||
| + | void f() { | ||
| + | first_mutex.lock(); | ||
| + | second_mutex.lock(); | ||
| + | ... | ||
| + | } | ||
| + | |||
| + | void g() { | ||
| + | second_mutex.lock(); | ||
| + | first_mutex.lock(); | ||
| + | ... | ||
| + | } | ||
| + | </ | ||
| + | - Гонка данных (Data Race) | ||
| + | - Взаимная блокировка (Deadlock) | ||
| + | - Проблема ABA | ||
| + | - Инверсия приоритетов | ||
| + | |||
| + | ===== 10. Реализация lock-free алгоритмов ===== | ||
| + | Почему lock-free алгоритмы легче реализовать на языке со сборщиком мусора, | ||
| + | - Невозможна инверсия приоритетов | ||
| + | - Наличие существующих базовых контейнеров в java.util.concurrent | ||
| + | - Невозможна проблема ABA | ||
| + | - Наличие CAS-операций | ||
| + | |||
| + | ===== 11. Профилирование ===== | ||
| + | Укажите какие виды профилирования желательно применить для комплексного анализа проблем приложения: | ||
| + | - Инструментирующее и сэмплирующее | ||
| + | - Поиск hot spots и анализ издержек на ожидание и синхронизацию (locks and waits) | ||
| + | - Интрузивное и неинтрузивное | ||
| + | - В отладочной сборке и release-сборке | ||
| + | |||
| + | ===== 12. Выбор шаблона ===== | ||
| + | Укажите, | ||
| + | - Thread Pool | ||
| + | - Double Check | ||
| + | - Local Serializer | ||
| + | - Pipeline | ||
| + | |||
| + | ===== 13. Выбор шаблона ===== | ||
| + | Укажите, | ||
| + | - Thread Pool | ||
| + | - Double Check | ||
| + | - Recursive Data | ||
| + | - Pipeline | ||
| + | |||
| + | ===== 14. Узкое место при работе с контейнерами ===== | ||
| + | В чём заключается одна из основных причин просадки производительности (увеличение времени выполнения операции) при активной конкурентной работе с контейнерами (в предположении, | ||
| + | - Сложность поиска / удаления / вставки элементов | ||
| + | - Переключение контекста процесса | ||
| + | - Потокобезопасность функции new | ||
| + | - Промашки по кэшу процессора | ||
| + | |||
| + | ===== 15. Task-based разработка ===== | ||
| + | Выберите технологию, | ||
| + | - OpenMP | ||
| + | - MPI | ||
| + | - Intel TBB / ForkJoin framework | ||
| + | - Java Threads | ||
| + | |||
| + | ===== 16. Выбор технологии ===== | ||
| + | Выберите технологию, | ||
| + | - OpenMP | ||
| + | - MPI | ||
| + | - Intel TBB / ForkJoin framework | ||
| + | - Java Threads | ||
| + | |||
| + | ===== 17. Оптимизации в компиляторе ===== | ||
| + | Выберите оптимизацию JIT-компилятора, | ||
| + | - Объединение захвата примитивов | ||
| + | - Оптимистичный захват | ||
| + | - Адаптивные блокировки | ||
| + | - Замена виртуального вызова | ||
| + | |||
| + | ===== 18. Модель памяти ===== | ||
| + | Выберите модель памяти, | ||
| + | - Sequential Consistency | ||
| + | - Strong-ordered | ||
| + | - Weak-ordered | ||
| + | - Super-weak | ||
| + | |||
| + | ===== 19. Асинхронный ввод/ | ||
| + | Выберите тип ввода/ | ||
| + | - Синхронный блокирующий | ||
| + | - Асинхронный блокирующий | ||
| + | - Синхронный неблокирующий | ||
| + | - Асинхронный неблокирующий | ||
| + | |||
| + | ===== 20. Консенсус ===== | ||
| + | Какое консенснусное число CAS-операций: | ||
| + | - 1 | ||
| + | - 2 | ||
| + | - 2N-2 (где N-число ячеек памяти, | ||
| + | - Бесконечность | ||
| + | |||
| + | |||
courses/high_performance_computing/questions.1477866080.txt.gz · Last modified: 2016/10/31 01:21 by kel