Лабораторная работа N2 (низкоуровневая синхронизация потоков) по курсу «Низкоуровневое Программирование» Вариант № 2 от 2014-12-02
Разработать собственное представление и потокобезопасную реализацию основных операций вставки, удаления и поиска в несбалансированном двоичном дереве; Для проверки работоспособности разработать систему тестов; Запрещается применять стандартные примитивы синхронизации; Разработка выполняется на С и встроенном ассемблере MSVC 32 бита и GCC 32 и 64 бита. Встроенный ассемблер надо использовать в минимально необходимой степени, но так, чтобы получить максимально эффективный результирующий код. Разработка многопоточной версии выполняется на основе варианта, разработанного в рамках домашнего задания по крусу архитектуры (при совпадении тем);
- Удаление также было не реализовано, как и в работе по архитектуре...
- Был оставлен только vEB порядок
- В процессе разработки были попробованы реализации на mutex, rwlock и наконец seqlock (реализации примитивов синхронизации расположены в соответствующих файлах)
- Все время указано в секундах
Код написан на языке С, для необходимы gcc и qmake.
Для компиляции выполнить:
- qmake lab6.pro
- make
В файле "include.h": 1.
#define CACHE_LINE_SIZE 64
Задает размер кэш-линии (используется в malloc для выравнивания).
#define HEIGHT 5
Задает высоту кластера. Должна быть >= 4.
В файле "main.c":
#define CPUS_NUM 8
#define TESTS_INSERT 4032000*9
#define TESTS_FIND 40320000
Задает число процессоров, количество тестов на вставку, количество тестов на поиск.
Приложение является консольным.
- На вход ничего не принимает.
- На выход выдает информацию:
-
Время аллокации памяти для тестов: а) поиск б) удаление
-
Время выполнения однопроцессорной версии без всяких синхронизаций: а) поиск б) удаление
-
Во всех остальных строчках выдает: а) количество потоков б) время на вставку при данном числе потоков в) время на поиск при данном числе потоков
Пример результата работы программы при параметрах
#define CPUS_NUM 8
#define TESTS_INSERT 4032000*9
#define TESTS_FIND 40320000
выход:
Allocating memory
Time elapsed: 9,40260196896269917
Time elapsed: 5,20849413494579494
Testing single thread with out any sync:
Time elapsed: 26,3823331110179424
Time elapsed: 23,9623020130675286
Threads: 2
Time elapsed: 17,5209693800425157
Time elapsed: 14,2657347529893741
Threads: 3
Time elapsed: 12,4543397920206189
Time elapsed: 10,2702292829053476
Threads: 4
Time elapsed: 10,2781622559996322
Time elapsed: 8,19344480405561626
Threads: 5
Time elapsed: 9,37511635501869023
Time elapsed: 7,19041527900844812
Threads: 6
Time elapsed: 8,69638188392855227
Time elapsed: 6,15473217400722206
Threads: 7
Time elapsed: 7,89636765699833632
Time elapsed: 5,57781437400262803
Threads: 8
Time elapsed: 7,85514036600943655
Time elapsed: 5,28296633099671453