Skip to content

Commit cad7adf

Browse files
committed
1-4 issue completed
1 parent 76c3767 commit cad7adf

File tree

6 files changed

+11
-6
lines changed

6 files changed

+11
-6
lines changed

Backlog for triage.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
1. 10.09.2019. Мария Румянцева: "с. 70, условие первой лабораторной, п. 5. В предыдущем пункте мы присваиваем переменной К хотя бы 4 значения, то есть по идее количество программ у нас от 4 до бесконечности, а в условии - чётко 10."
22
11.09.2019. Балакшин П.В. Да, верно. Должно быть "В результате получится одна нераспараллеленная программа и 4+ распараллеленных."
3+
fixed
34

45
2. 10.09.2019. Мария Румянцева: ". 73, этап Map, действия с массивом М2. Тут возник вопрос в том, что при сложении с предыдущим элементом нам нужно изначальное его значение или вычисленное на предыдущем этапе. Если вычисленное на предыдущем этапе, то похоже, стоит это указать, потому что у нас вопросы всё-таки возникли, ибо это не будет параллелиться. :)"
56
11.09.2019. Балакшин П.В. Мы в своё время решили, что у вас должен быть ещё один массив (= копия исходного массива). Т.е. надо просто поподробнее расписать.
7+
fixed
68

79
3. 10.09.2019. Мария Румянцева: "В табличке на той же странице в пункте 1 куда-то улетел минус и двойка в имени массива в M2[i-1]"
810
11.09.2019. Балакшин П.В. Да, верно. Должно быть "... + M2[i-1])..."
11+
fixed
912

1013
4. 11.09.2019. Балакшин П.В. В 1-й лабораторной в пунктах 3 и 4 использовать ключ -O3, а не -O2.
14+
fixed

main.pdf

918 Bytes
Binary file not shown.

main.synctex.gz

4.06 KB
Binary file not shown.

section3_5.tex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,10 @@
5050
\begin{figure}[H]
5151
\lstinputlisting{raceConditionalExample1.cpp}
5252
\end{figure}
53+
\parС данной проблемой можно столкнуться даже в тех программах, в которых многопоточное программирование не используется явно, но используются какие-то разделяемые ресурсы. Например, если программа копирует текст из поля ввода в буфер обмена и затем тут же вставляется текст в другое поле, то, если она будет запускаться на компьютере одна, то всегда будет работать правильно. Однако если одновременно с ней будет работать программа, также использующая буфер обмена, она может перезаписать значение буфера обмена, даже если команды копирования и вставки будут расположены строго друг за другом. Использование общих ресурсов, даже на очень короткий срок может привести к ошибке.
5354
\parТакое являние получило название ''гейзенбаг'' или ''плавающая ошибка''. Чтобы избежать этой ситуации надо блокировать запись нового значения переменной в первой потоке, пока второй поток не закончит работу. Например, в технологии OpenMP эту проблему решить следующим образом (сохранить старое значение в другой переменной):
5455
\begin{figure}[H]
55-
\lstinputlisting{raceConditionalExample1.cpp}
56+
\lstinputlisting{raceConditionalExample2.cpp}
5657
\end{figure}
5758
\par\textbf{Проблема ABA} - проблема, при которой поток два раза читая одинаковое значение ''думает'', что данные не изменились. Например, первый поток присвоил переменной значение A. Второй поток присвоил ей значение В, а потом снова А. Когда первый поток снова читает эту переменную, она равна А, и он ''думает'', что ничего не изменилось. Более практичный пример из программирования: в переменной хранится адрес, указывающий на начало массива. Второй поток освобождает память для нового массива функцией free и создает его функцией malloc, которая выделила память в том же месте, так как эта область памяти уже свободна. Когда первый поток сравнивает значения указателя на массив до и после, он видит, что они равны и решает, что массив не изменился, хотя на его месте уже хранятся новый данные. Чтобы решить эту проблему можно хранить признак того, что массив был изменен.
5859
\par\textbf{Инверсия приоритетов.} Представим ситуацию, в которой существует 3 потока с приоритетами: высокий, средний и низкий соответственно, причем потоки с высоким и низким приоритетом захватывают общий мьютекс. Пусть поток с низким приоритетом захватил мьютекс и начал свое выполнение, но его прервал поток со средним приоритетом. Теперь, если поток с высоким приоритетом перехватит приоритетом начнет выполняться, он будет ждать освобождения мьютекса, но поток с низким приоритетом не может его освободить, так как его вытеснил поток со средним приоритетом. Эта проблема решается заданием всем потокам одного приоритета на время удержания мьютекса.

section4_1.tex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
\begin{figure}[H]
88
\lstinputlisting{lab1Example.cpp}
99
\end{figure}
10-
\itemСкомпилировать написанную программу без использования автоматического распараллеливания с помощью следующей команды: /home/user/gcc -O2 -Wall -Werror -o lab1-seq lab1.c
11-
\itemСкомпилировать написанную программу, используя встроенное в gcc средство автоматического распараллеливания Graphite с помощью следующей команды “/home/user/gcc -O2 -Wall -Werror -floop-parallelize-all -ftree-parallelize-loops=K lab1.c -o lab1-par-K” (переменной K поочерёдно присвоить хотя бы 4 различных целых значений, выбор обосновать).
12-
\itemВ результате получится одна нераспараллеленная программа и десять распараллеленных.
10+
\itemСкомпилировать написанную программу без использования автоматического распараллеливания с помощью следующей команды: /home/user/gcc -O3 -Wall -Werror -o lab1-seq lab1.c
11+
\itemСкомпилировать написанную программу, используя встроенное в gcc средство автоматического распараллеливания Graphite с помощью следующей команды “/home/user/gcc -O3 -Wall -Werror -floop-parallelize-all -ftree-parallelize-loops=K lab1.c -o lab1-par-K” (переменной K поочерёдно присвоить хотя бы 4 различных целых значений, выбор обосновать).
12+
\itemВ результате получится одна нераспараллеленная программа и четыре или более распараллеленных.
1313
\itemЗакрыть все работающие в операционной системе прикладные программы (включая Winamp, uTorrent, браузеры и Skype), чтобы они не влияли на результаты последующих экспериментов.
1414
\itemЗапускать файл lab1-seq из командной строки, увеличивая значения N до значения N1, при котором время выполнения превысит 0.01 с. Подобным образом найти значение N=N2, при котором время выполнения превысит 2 с.
1515
\itemИспользуя найденные значения N1 и N2, выполнить следующие эксперименты (для автоматизации проведения экспериментов рекомендуется написать скрипт):

section4_4.tex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@
2525
\hline
2626
\end{tabular}
2727
\end{center}
28-
Затем в массиве М2 каждый элемент поочерёдно сложить с предыдущим, а к результату сложения применить операцию из таблицы (считать, что для начального элемента массива предыдущий элемент равен нулю):
28+
Затем в массиве М2 каждый элемент поочерёдно сложить с предыдущим (для этого вам понадобится копия массива М2, из которого нужно будет брать операнды), а к результату сложения применить операцию из таблицы (считать, что для начального элемента массива предыдущий элемент равен нулю):
2929
\begin{center}
3030
\begin{tabular}{|c|c|}
3131
\hline
3232
\specialcell{\textbf{Номер}\\ \textbf{варианта}} & \textbf{Операция} \\
3333
\hline
34-
1 & Модуль синуса (т.е. M2[i] = |sin(M2[i] + M[i1])|) \\
34+
1 & Модуль синуса (т.е. M2[i] = |sin(M2[i] + M2[i-1])|) \\
3535
\hline
3636
2 & Модуль косинуса \\
3737
\hline

0 commit comments

Comments
 (0)