Skip to content

Commit e7c3ffa

Browse files
committed
Add first project and report
1 parent 7485a5c commit e7c3ffa

File tree

7 files changed

+775
-0
lines changed

7 files changed

+775
-0
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "work2/Multithreaded-Merge-Sort"]
2+
path = work2/Multithreaded-Merge-Sort
3+
url = https://github.com/HxnDev/Multithreaded-Merge-Sort

work2/Multithreaded-Merge-Sort

work2/README.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# Проект 1
2+
3+
Анализировался проект https://github.com/HxnDev/Multithreaded-Merge-Sort, в котором реализована
4+
версия алгоритма merge-sort. Шаги алгоритма: сначала массив делится на 4 последовательные части,
5+
дальше все они сортируются параллельно: функции сортировки каждой части запускаются каждая
6+
в своем потоке. Затем вызывается функция слияния, которая объединяет получившиеся части в единый
7+
массив, алгоритм окончен.
8+
9+
## Helgrind
10+
Сборка исполняемого файла и первый запуск helgrind:
11+
```
12+
$ g++ -g -pthread -o main Multithreaded-Merge-Sort/q2.cpp
13+
$ valgrind --tool=helgrind --log-file=helgrind-log-1-1 ./main < input1.txt
14+
```
15+
Файл [input1.txt](https://github.com/aartdem/multithreaded-programming/blob/main/work2/input1.txt) -
16+
исходные данные для программы (число элементов в массиве и сам массив). Результат работы helgrind доступны в
17+
файле [helgrind-log-1-1.txt](https://github.com/aartdem/multithreaded-programming/blob/main/work2/helgrind-log-1-1.txt).
18+
19+
Мы можем видеть, что helgrind нашел 85 ошибок. При детальном рассмотрении ставновится понятно, что все эти ошибки
20+
связаны с потоком вывода, так как каждая функция сортировки выводит результат своей работы в консоль.
21+
Возможны два решения:
22+
1. В начале и в конце каждой функции сортировки захватывать и отпускать мьютекс соотвественно. В таком случае
23+
исполнение программы будет эквивалентно исполнению на одном потоке, что уменьшит производительность.
24+
2. Закомментировать/удалить промежуточные выводы функций сортировки в консоль, так как эта информация
25+
полезна только при отладке.
26+
27+
Вывод helgrind после применения второго решения доуступен в файле
28+
[helgrind-log-1-2.txt](https://github.com/aartdem/multithreaded-programming/blob/main/work2/helgrind-log-1-2.txt),
29+
теперь количество ошибок стало равняться нулю
30+
31+
## Threadsanitizer
32+
Первый вывод инструмета:
33+
```
34+
$ clang++ -fsanitize=thread -g -pthread -o main Multithreaded-Merge-Sort/q2.cpp
35+
$ ./main < input1.txt
36+
FATAL: ThreadSanitizer: unexpected memory mapping 0x5f5a01a36000-0x5f5a01a57000
37+
```
38+
Как оказалалось, такая ошибка может возникать на некоторых версиях ядра Linux, что обсуждается
39+
в [этом треде](https://github.com/google/sanitizers/issues/1716). Ошибка связана с ASLR. Решение,
40+
что мне помогло, ниже:
41+
```
42+
$ sudo sysctl vm.mmap_rnd_bits=28
43+
```
44+
После повторного запуска санитайзера получаем более осмысленные результаты, вывод в
45+
[thread-sanitizer-log-1.txt](https://github.com/aartdem/multithreaded-programming/blob/main/work2/thread-sanitizer-log-1.txt).
46+
SUMMARY:
47+
```
48+
SUMMARY: ThreadSanitizer: heap-use-after-free /home/aartdem/multithreaded-programming/work2/Multithreaded-Merge-Sort/q2.cpp:184:34 in mergeArray(void*)
49+
```
50+
Проблемы начинаются со строчки 172. Массив second_half имеет размер size_/2, но в строчках 182-190
51+
к нему происходит обращение по индексам в диапазоне [size_/2; size_). Таким образом, ThreadSanitizer правильно определил
52+
место в коде и поток, в котором происходит некорректное обращение к памяти.

0 commit comments

Comments
 (0)