User Tag List

Страница 28 из 34 ПерваяПервая ... 242526272829303132 ... ПоследняяПоследняя
Показано с 271 по 280 из 331

Тема: Вычисление числа Пи на ассемблере

  1. #271

    Регистрация
    16.12.2014
    Адрес
    г. Ожерелье
    Сообщений
    769
    Спасибо Благодарностей отдано 
    252
    Спасибо Благодарностей получено 
    46
    Поблагодарили
    42 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    С сожалением вспоминаю, что возможно моя поспешно выбранная позиция, послужила демотиватором для уважаемого ivagor'a. Интересно было бы посмотреть на 8085 коды. Это же какая-то почти уникальнось. Сам сделал на днях код для короля 8-х процессоров 6309. С двумя 16-битными и быстрыми аккумуляторами, с аппаратным делением 32-разрядных чисел и полной совместимостью с 6809 такой чип наверное позволительно так называть. Народ до сих пор свои Коко и Драконы обновляет. Хотя все несуразности 6809 также унаследованы, но с 16 битным АЛУ они почти незаметны. На "затворе-шпиготе" 6309 показал себя в 3.62 раза быстрее, чем 6809. В 6502 бы четыре аккумулятора и аппаратные умножение с делением...

  2. #271
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #272

    Регистрация
    20.06.2014
    Адрес
    г. Орск, Оренбургская обл.
    Сообщений
    813
    Спасибо Благодарностей отдано 
    33
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    60 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от litwr Посмотреть сообщение
    В 6502 бы четыре аккумулятора и аппаратные умножение с делением...
    Дык, у SuperCPU(65816) тоже потенциал приличный. Однако, кроме частоты этим не воспользовались...
    Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).

  4. #273

    Регистрация
    16.12.2014
    Адрес
    г. Ожерелье
    Сообщений
    769
    Спасибо Благодарностей отдано 
    252
    Спасибо Благодарностей получено 
    46
    Поблагодарили
    42 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    65816 - в каком-то смысле позор. Такое можно было сделать и к 77-78. В 75-м 6502 рвал 8080, а 65816 рядом с 8086 выглядит бледно. Ни новых регистров, ни даже аппаратного умножения, новых команд практически нет. В режиме 16 бит всего-то процентов на 50% быстрее изначального 6502... Команды не разогнаны как на 4510. С 6309 сравнивать не совсем корректно. 65816 - 16-разрядный процессор с 8-битной шиной данных, а 6309 8-разрядный с 16-разрядным АЛУ. Можно сравнить с 65802, которым можно было заменять на плате 6502 (так и делали с Эплами). 6309 гораздо мощнее. На 1.7 МГц, на арифметике легко обгоняет 8086 на 5 МГц. 65816/02 на арифметике примерно как 8086. 65816 может с 16 МБ памяти работать, но неуклюже. R800 (который в раза 4 быстрее z80) также 6309 проигрывает на арифметике раза в два. Не давали японцам развернуться, хотя и не засудили как NEC или MOS Technology.

  5. #274

    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Из формул Мачина наиболее замечательная для i8080 будет:

    32*atan(1/10)-4*atan(1/239)-16*atan(1/515)

    если считать в 100-ой системе, по такому алгоритму:
    Код:
    a=32/10
    b=4/239
    c=16/515
    for n=1 to len
      pi=(a-b-c)/(2n-1) ;здесь было n, что есть злобный баг
      a/=100
      b/=239 b/=239
      c/=103 c/=103 c/=25
    end for
    Деление на 25,103 и 239 делается по таблицам менее чем за 70 тактов на байт, а на 100 вообще делить не потребуется. Единственная сложная операция это деление на n, там получается примерно 400 тактов на байт, если делитель более 127. Но деление на n можно совместить для всех трёх слагаемых, при этом память будет требоваться для pi и трёх слагаемых. Результаты в EmuZWin для 3.5 МГц получились такие:

    100 цифр - 0,2 ms (=1/5 s)
    300 цифр - 2 s
    1000 цифр - 25 s
    4000 цифр - 418 s

    В архиве текст программы и картинки, большие цифры это время в кадрах. Что касается вычислений, то там только команды i8080 используются, если нигде не зевнул. Комментариев пока нету, но если кто будет допиливать для реального i8080 могу добавить.
    Нажмите на изображение для увеличения. 

Название:	PI_100.jpg 
Просмотров:	380 
Размер:	19.1 Кб 
ID:	59403Нажмите на изображение для увеличения. 

Название:	PI_300.jpg 
Просмотров:	411 
Размер:	18.9 Кб 
ID:	59405Нажмите на изображение для увеличения. 

Название:	PI_1000.jpg 
Просмотров:	406 
Размер:	21.4 Кб 
ID:	59404Нажмите на изображение для увеличения. 

Название:	PI_4000.jpg 
Просмотров:	442 
Размер:	20.6 Кб 
ID:	59406pi_fast.zip
    Последний раз редактировалось blackmirror; 30.01.2017 в 15:23. Причина: баг в алгоритме

  6. #275

    Регистрация
    16.12.2014
    Адрес
    г. Ожерелье
    Сообщений
    769
    Спасибо Благодарностей отдано 
    252
    Спасибо Благодарностей получено 
    46
    Поблагодарили
    42 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Peзультаты - супер! Но возможно вы выложили не ту версию программы. Та, что есть, под СР/М считает неправильно 314227... - не пи. По адресу $8fcd высчитывается $1f2a1b42... И почему без бинарника? Использован ассемблер с некоторыми неожиданными особенностями типа CP A,5 и ADC 0 - первую инструкцию по стандарту Zilog пишут CP 5, а вторую ADC A,0.
    Интересно уважаемый ivagor в курсе? С хорошей оптимизацией Вектор может перехватить лидерство. А с версией для 8085 может стать и недосигаемым.
    Кстати, так до сих пор и не разобрался, как работают задержки на Спектруме. Вроде их нет при обращении к памяти выше $8000. У вас программа и все данные именно там. Но интересно, что происходит, если процессор обращается к памяти ниже $8000 из программы, которая выше $8000? Заранее благодарен за ответ или ссылку.

  7. #276

    Регистрация
    20.03.2007
    Адрес
    Санкт-Петербург
    Сообщений
    3,000
    Спасибо Благодарностей отдано 
    201
    Спасибо Благодарностей получено 
    113
    Поблагодарили
    97 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от blackmirror Посмотреть сообщение
    В архиве текст программы и картинки, большие цифры это время в кадрах.
    Прикольно. Неужели из топика всё же родился хоть какой-то бенч для Спекка? Хотя нет - только .asm внутри. Запилите нормальный бенч для Спекка на самом быстром алгоритме Z80! Можно будет пиписками померяться.
    МГТФ - любимый провод!
    KAY-1024(4096)/SL-4/TURBO v2010 + Nemo-FDC + Nemo-IDE (CF 4GB) + SMUC2 Rev.B RTC (HDD 1.6GB + DVD-ROM) + PROF-ROM + ZXMC2 + GENERAL SOUND 2MB + ZX-BUS_TEE + FDD 3.5' + FDD 5.25' + VGA&PAL

  8. #277

    Регистрация
    16.12.2014
    Адрес
    г. Ожерелье
    Сообщений
    769
    Спасибо Благодарностей отдано 
    252
    Спасибо Благодарностей получено 
    46
    Поблагодарили
    42 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А для заинтересовавшихся с другими процессорами хорошо бы и алгоритм на ЯВУ выложить...

  9. #278

    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от litwr Посмотреть сообщение
    Peзультаты - супер! Но возможно вы выложили не ту версию программы. Та, что есть, под СР/М считает неправильно 314227... - не пи. По адресу $8fcd высчитывается $1f2a1b42... И почему без бинарника? Использован ассемблер с некоторыми неожиданными особенностями типа CP A,5 и ADC 0 - первую инструкцию по стандарту Zilog пишут CP 5, а вторую ADC A,0.
    Скачал код из архива, запустил в EmuZWin, вроде вычисляется Пи, в памяти тоже Пи лежит. Всё это безобразие было написано в эмуляторе (причём Z80) без всякой CP/M, выгрузить кусок памяти в двоичный файл там можно, а в другие форматы нет. На всякий случай положил картинку в архив и 4 дампа для 100, 300, 1000 и 4000 цифр, но как их преобразовать во что-то загружаемое я не знаю.
    pi_dump.zipНажмите на изображение для увеличения. 

Название:	pi_dump.jpg 
Просмотров:	431 
Размер:	21.5 Кб 
ID:	59587
    Самое забавное, что для большого количества цифр данный алгоритм можно еще ускорить, если и оставшееся деление(на нечётные числа которые присутствуют в разложении арктангенса) делать по таблицам, в теории можно получить ускорение в 1,5-2 раза.

  10. #279

    Регистрация
    16.12.2014
    Адрес
    г. Ожерелье
    Сообщений
    769
    Спасибо Благодарностей отдано 
    252
    Спасибо Благодарностей получено 
    46
    Поблагодарили
    42 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    У вас в исходнике на ассемблере после DIV_15: стоит LD HL,$4300, а в дампе вместо $43 - $56. Кроме того,расхождение в константах после INIT103: и INIT239: .
    EDIT. Подставил константы из дампов и заработало! На Амстраде 1000 знаков за 30.8 секунд с печатью через медленный БДОС. Затвор тут в 6 раз тормознее. Но можно быть добрее и прописать константы в исходник, например, PI_LEN = PI_DIGITS/2+1+X... Еще бы убрать лишние цифры, которые, как правило, неверные.
    Но в целом получилась очень хорошая программа. Так и до формул Чудновских можно дойти.
    Последний раз редактировалось litwr; 30.01.2017 в 20:39.

  11. #280

    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    litwr, после DIV15 там просто индикатор прогресса, в какой-то момент я решил что лучше его разместить между строками, чем затирать цифры. А вот с INIT могут быть и проблемы, или это просто массивы куда-то переехали.
    Лишней цифрой обычно оказывалась только последняя, которая живёт в одном байте с правильной предпоследней, поэтому мне было лень из разделять.
    От Чудновских никаких плюшек ждать не стоит, у них тоже квадратичная сложность, и хоть за один проход они дают по 14 цифр, но там факториалы и на каждом шаге они дают десяток множителей/делителей которые не засунешь в таблицы. Два деления на 239, два на 103 еще одно на 25 и вычитания в сумме занимают меньше тактов чем одно честное деление для n>256, поэтому прорыв теперь может быть только с удвоением числа правильных цифр на каждом шаге, но не факт что это случится для менее чем 10000 цифр.

    По просьбам трудящихся версия программы на Си, максимально упрощённая, но с некоторыми намёками в какую сторону оптимизировать:
    pi.zip

Страница 28 из 34 ПерваяПервая ... 242526272829303132 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Арифметические процедуры на ассемблере
    от spensor в разделе Программирование
    Ответов: 27
    Последнее: 13.05.2017, 20:56
  2. Мнемокоманды и числа.
    от ALKO в разделе Программирование
    Ответов: 0
    Последнее: 15.02.2014, 03:49
  3. try-catch на ассемблере z80
    от siril в разделе Программирование
    Ответов: 22
    Последнее: 30.10.2012, 21:17
  4. Определение числа сторон
    от mungo в разделе Внешние накопители
    Ответов: 1
    Последнее: 16.03.2012, 18:06

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •