Задание: Разработать программу вычисления корня пятой степени согласно быстро сходящемуся итерационному алгоритму определения корня n-той степени с точностью не хуже 0,1%.
- исходный код на си, скомпилированный с разными опциями, шаги рефакторинга ассемблероного кода пропущены т.к. писалась программа на ассемблере с нуля.
- сравнительные тесты показывающие скорость работы обоих программ.
- генератор случайных чисел с указанием границ
- ввод-вывод из файла
- измерение времени работы программы
- текст программы на языке ассемблера без использования си функций
- ассемблерный код содержит поясняющие комментарии
В папке "10" находятся все необходимые файлы на эту оценку. В "10" -> "lib" можно найти
- array.s (работа с массивами)
- math.s (функции для вычисления)
- io.s (input & output)
- str.s (работа со строками)
- time.s (Измерение времени выполнения)
- rand.s (Рандомная генерация) В "10" -> "main.s" можно найти программа написанная "вручную" В файлах:
- 8.c находится реализация алгоритма на Си, где присутсвует обработка всех возможных вводов и выводов данных, замеры веремни и генерация рандомных значений
- 8.s находится скомпилированная программа на ассемблере из Си (8.с), где убраны все лишние макросы, программа скомпилирована с помощью команды:
gcc -masm=intel -fno-asynchronous-unwind-tables -fno-jump-tables -fno-stack-protector -fno-exceptions -S 8.c
- 8-ref.s находится программа после рефакторинга, где максимально замещена работа со стеком на работу с регистрами.
Для компиляции и построения программы был написан Makefile, введи последовательно эти команды:
Далее необходимо ввести ./main _, на месте _ введите необходимый ключ:
- ключ -с (ввод искомого значения из командой строки)
- ключ -f input.txt output.txt (ввод из входного файла и запись результата в выходной файл) (!!!ВАЖНО, после ввода числа в файл input.txt нажмите enter!!!)
- ключ -r N M(где N нижняя граница генерации рандомного числа, а М - верхняя)
Далее были реализованы разные способы ввода:
Также модификация программы на C и программы на ассемблере, полученной после рефакторинга, для проведения сравнения на производительность.
Размер .s файла полученного после компиляции с помощью флагов -masm=intel -fno-asynchronous-unwind-tables -fno-jump-tables -fno-stack-protector -fno-exceptions -Os состовляет 473 строки, в то время когда с оптимизацией -Ofast 452 строки. В то же время размер программы написанной "вручную" состовляет 405 строк в main файле + 1146 строк в вспомогательных файлах, которые лежат в папке lib. Но размер ассемблер файла состовляет 14,7K, а у программы на си 20K, даже учитывая флаг -Os.
mabs() - функция принимает на вход double x. Функция возвращает модуль этого числа x.
root_res() - функция принимает double num, над которой производятся вычисления корня пятой степени согласно быстро сходящемуся итерационному алгоритму определения корня n-той степени с точностью не хуже 0,1%.
Я разделил код ассемблера на файл с функциями и файл с main. Далее скомпилировал полученные файлы и запустил файлы с исходными данными и файла для вывода результатов с использованием аргументов командной строки.
Для проверки ввести команды:
Файл | Тест | Результат | Соотвествие |
---|---|---|---|
8.c | 32 | 2 | True |
8.s | 32 | 2 | True |
8.c | 243 | 3 | True |
8.s | 243 | 3 | True |
8.c | 100 | 2.512 | True |
8.s | 100 | 2.512 | True |
8.c | 150 | 2.724 | True |
8.s | 150 | 2.724 | True |
Файл | Тест | Результат | Соотвествие |
---|---|---|---|
8.s | 32 | 2 | True |
main.s | 32 | 2 | True |
8-ref.s | 32 | 2 | True |
8.s | 243 | 3 | True |
main.s | 243 | 3 | True |
8-ref.s | 243 | 3 | True |
8.s | 100 | 2.512 | True |
main.s | 100 | 2.512 | True |
8-ref.s | 100 | 2.512 | True |