Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 14:41

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Скорость исполнения кода
СообщениеДобавлено: Сб окт 13, 2018 10:50 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 08, 2018 10:48
Сообщения: 6
Благодарил (а): 3 раз.
Поблагодарили: 0 раз.
Я (новичок в программировании FASM и SPF) правильно понимаю, что SPF устроен так, что очень часто использует прыжки с одной части кода в другую (от слова к слову), а потому полностью рушит ускорение исполнения кода с помощью конвейера процессора? И где можно просмотреть SPF_FAQ?

_________________
Я новичок, который ожидал развитую инфраструктуру Forth, но не нашёл её, и решил сделать в этом первый шаг! JNI, я иду к тебе!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Скорость исполнения кода
СообщениеДобавлено: Сб окт 13, 2018 11:54 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
:?:
Переход от одного слова к другому в СПФ это обычный вызов с помощью CALL (ассемблер). В СПФе всё нативно в этом плане без заморочек.

Цитата:
а потому полностью рушит ускорение исполнения кода с помощью конвейера процессора?

это как?

Цитата:
Где можно просмотреть SPF_FAQ?

\docs\intro.ru.html

Ещё в поставке СПФ есть справочник \docs\papers

Или спрашивайте тут на форуме. Поможем, чем сможем

_________________
Цель: сделать 64-битную Нову под Винду



За это сообщение автора Victor__v поблагодарил: Askalite
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Скорость исполнения кода
СообщениеДобавлено: Сб окт 13, 2018 15:48 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Askalite писал(а):
прыжки с одной части кода в другую (от слова к слову), а потому полностью рушит ускорение исполнения кода с помощью конвейера процессора?

Современные процессоры устроены не так просто. Для конвейеризованного процессора действительно важно, чтобы команды выполнялись последовательно, потому что за командой jmp, вошедшей в конвейер, тянутся еще команды, которые будут уже не нужны после перехода. Но если говорить о суперскалярной архитектуре (современные x86), то в них как раз анализируется конвейер, и если туда прочитана команда безусловного перехода, то чтение следующих команд начинается уже с нового адреса. Это неплохо работает даже для условных переходов https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2



За это сообщение автора Hishnik поблагодарил: Askalite
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Скорость исполнения кода
СообщениеДобавлено: Вт окт 16, 2018 09:28 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 08, 2018 10:48
Сообщения: 6
Благодарил (а): 3 раз.
Поблагодарили: 0 раз.
Victor__v писал(а):
:?:
Переход от одного слова к другому в СПФ это обычный вызов с помощью CALL (ассемблер). В СПФе всё нативно в этом плане без заморочек.


Допустим два слова:

А Б

Интерпретатор идёт к первому слову А, предварительно в стек возрата адрес слова Б, а потом после выполнения делает jmp по неизвестному месту, из стека аозвратов, что по идее должно сбивать предсказание, но ваши ответы и Hishnik всё мне объяснили, даже больше чем вся документация, что я нарыл по SPF. А теперь к другому:

http://spf.sourceforge.net/docs/src.ru.html

EAX - вершина стека данных
EBP - указатель на стек данных (т.е. [EBP] - второй элемент стека данных)
Стек параметров адресуется регистром EBP, вершина стека хранится в EAX
Дно: S0

1) Я так понимаю стек параметров и данных одно и тоже?
2) Чем отличается EAX от EBP?
3) [EBP] это указатель на второй элемент или значение второго элемента?

Было бы неплохо объяснить и пример этого кода:
Код:
CODE DUP ( x -- x x )
    LEA EBP, -4 [EBP]
    MOV [EBP], EAX
    RET
END-CODE


Особенно непонятен момент с тем, где здесь работа с адресами/указателями, а где со значениями. (Я очень плохо знаю ASM)

_________________
Я новичок, который ожидал развитую инфраструктуру Forth, но не нашёл её, и решил сделать в этом первый шаг! JNI, я иду к тебе!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Скорость исполнения кода
СообщениеДобавлено: Вт окт 16, 2018 11:41 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Начнём с того, что в СПФ при вызове какого-либо слова интерпретатор перестаёт работать.
К примеру,
Код:
: TEST 10 . 20 . 30 . CR ." HELLO WORD" CR ;
TEST

1-я строчка: Создаём определение. нас это не интересует.
2-я строчка: Теперь вызываем слово из режима интерпретации.
В этом случае INTERPRET находит указатель на начало кода слова TEST и передаёт управление этому слову. Интерпретатор до завершения слова TEST никак не участвует.

Цитата:
Допустим два слова:

А Б

В данном случае в режиме интерпретации
Сначала выполнится слово A потом управление перейдёт на INTERPRET, а потом на Б и снова на интерпретатор

Код:
предварительно в стек возрата адрес слова Б, а потом после выполнения делает jmp по неизвестному месту

Интересная схема, но замудрённая. В известных мне фортах всё проще.

Цитата:
1) Я так понимаю стек параметров и данных одно и тоже?

Да, обычно под этим понимается одно и тоже.

Цитата:
2) Чем отличается EAX от EBP?
3) [EBP] это указатель на второй элемент или значение второго элемента?

Это разные регистры :D
в регистре EAX хранится первый элемент стека данных
а в EBP указатель на второй элемент
соот-но в 4 [EBP] хранится третий элемент и т. д.

По коду DUP
Наверно вас смущает инструкция LEA?
На мой взгляд самая лучшая инструкция в интеле
Она позволяет стабильно за 1 такт (поправьте, если ошибаюсь) загрузить в регистр сумму значений других регистров

Код:
LEA EBP, -4 [EBP]

В данном случае EBP = -4 + EBP

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Скорость исполнения кода
СообщениеДобавлено: Ср окт 17, 2018 04:58 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 08, 2018 10:48
Сообщения: 6
Благодарил (а): 3 раз.
Поблагодарили: 0 раз.
Victor__v писал(а):
Это разные регистры :D
в регистре EAX хранится первый элемент стека данных
а в EBP указатель на второй элемент
соот-но в 4 [EBP] хранится третий элемент и т. д.


8 7 6 5 4 3 2 1 0 [адреса которые уменьшаются по росту стека]
7 0 1 2 3 4 5 0 r [значения где r — рандом]

7:0— нижний элемент стека 2:5 — верхний элемент
Итак:
S0 хранит адрес 8
[8] хранит значение 7

EAX хранит значение 5
EBP хранит адрес 3, а [3] имеет значение 4

Что хранит [EBP]? Адрес? Значение? "4 [EBP]" это какое-то отдельное слово где хранится 3 элемент?

Victor__v писал(а):
Наверно вас смущает инструкция LEA?

Код:
LEA EBP, -4 [EBP]

В данном случае EBP = -4 + EBP


Нет, LEA замечательная инструкция, меня смутил "-4 [EBP]", я ожидал увидеть [EBP-4] (изучаю синтаксис fasm).

_________________
Я новичок, который ожидал развитую инфраструктуру Forth, но не нашёл её, и решил сделать в этом первый шаг! JNI, я иду к тебе!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Скорость исполнения кода
СообщениеДобавлено: Ср окт 17, 2018 14:15 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Askalite писал(а):
Нет, LEA замечательная инструкция, меня смутил "-4 [EBP]", я ожидал увидеть [EBP-4] (изучаю синтаксис fasm).


В ассемблере и дизассемблере СПФа просто такой синтаксис. Вот и всё.

Так, теперь по стеку
По элементам:
1 EAX
2 [EBP]
3 [EBP+4]
4 [EBP+8]
и т. д.

Лучше сейчас этим не заморачиваться.
Тут как никак всё упирается в указатели.
Даже в сях указатели изучаются не сразу.

Наберётесь опыта всё станет понятнее.

_________________
Цель: сделать 64-битную Нову под Винду



За это сообщение автора Victor__v поблагодарил: Askalite
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Скорость исполнения кода
СообщениеДобавлено: Пн янв 21, 2019 05:20 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 08, 2018 10:48
Сообщения: 6
Благодарил (а): 3 раз.
Поблагодарили: 0 раз.
Victor__v писал(а):
Askalite писал(а):
Нет, LEA замечательная инструкция, меня смутил "-4 [EBP]", я ожидал увидеть [EBP-4] (изучаю синтаксис fasm).


В ассемблере и дизассемблере СПФа просто такой синтаксис. Вот и всё.

Так, теперь по стеку
По элементам:
1 EAX
2 [EBP]
3 [EBP+4]
4 [EBP+8]
и т. д.

Лучше сейчас этим не заморачиваться.
Тут как никак всё упирается в указатели.
Даже в сях указатели изучаются не сразу.

Наберётесь опыта всё станет понятнее.


Это всё нисколько мне не разьяснило ничего. Я знаю что такое указатель. Вы только сильнее запутали меня.

UPD:

Код:
CODE DUP ( x -- x x )
    LEA EBP, -4 [EBP]
    MOV [EBP], EAX
    RET
END-CODE


Сначала в EBP загружается адрес [EBP]-4
Потом значение EAX копируется в [EBP]

EBP - указатель на стек данных (т.е. [EBP] - второй элемент стека данных)

То есть положение [EBP] равняется EBP+4

То есть в EBP загружается адрес EBP+4-4

?????

_________________
Я новичок, который ожидал развитую инфраструктуру Forth, но не нашёл её, и решил сделать в этом первый шаг! JNI, я иду к тебе!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Скорость исполнения кода
СообщениеДобавлено: Пн янв 21, 2019 09:32 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Askalite писал(а):

Это всё нисколько мне не разьяснило ничего. Я знаю что такое указатель. Вы только сильнее запутали меня.

UPD:

Код:
CODE DUP ( x -- x x )
    LEA EBP, -4 [EBP]
    MOV [EBP], EAX
    RET
END-CODE


Сначала в EBP загружается адрес [EBP]-4
Потом значение EAX копируется в [EBP]

EBP - указатель на стек данных (т.е. [EBP] - второй элемент стека данных)

То есть положение [EBP] равняется EBP+4

То есть в EBP загружается адрес EBP+4-4

?????


Ладно, ещё раз
EBP=EBP+CELL
[EBP]=EAX
RET

"То есть в EBP загружается адрес EBP+4-4"
Нет, в него не загружается такой адрес

Зайдём с другого.
Зачем по вашему в форт-примитавах используется регистр EAX ?

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Скорость исполнения кода
СообщениеДобавлено: Чт янв 24, 2019 15:32 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 08, 2018 10:48
Сообщения: 6
Благодарил (а): 3 раз.
Поблагодарили: 0 раз.
Victor__v писал(а):

Ладно, ещё раз
EBP=EBP+CELL
[EBP]=EAX
RET

"То есть в EBP загружается адрес EBP+4-4"
Нет, в него не загружается такой адрес

Зайдём с другого.
Зачем по вашему в форт-примитавах используется регистр EAX ?


Я уже успел разобраться во всём самостоятельно.

Стек данных форта и стек данных это не одно и тоже!

EAX - вершина стека данных форта

EBP - вершина стека данных сразу после EAX

Правильное описание должно выглядеть так:

EAX - вершина стека данных форта
EBP - указатель на второй элемент стека данных (т.е. [EBP] - второй элемент стека данных форта)

А не как тут:
http://spf.sourceforge.net/docs/src.ru.html

А я то думал в EBP загружается адрес ячейки [EBP+4-4]

Я бы не ломал себе мозг, если бы с самого начала мануал был бы написан правильно.

UPD

Итак, итоги:
В EBP хранится адрес вершины стека данных, указатель на второй элемент стека данных, а первый элемент хранится в EAX.

_________________
Я новичок, который ожидал развитую инфраструктуру Forth, но не нашёл её, и решил сделать в этом первый шаг! JNI, я иду к тебе!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Скорость исполнения кода
СообщениеДобавлено: Чт янв 24, 2019 16:48 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Askalite писал(а):
Я уже успел разобраться во всём самостоятельно.

Стек данных форта и стек данных это не одно и тоже!
EAX - вершина стека данных форта
...

Не стэка Форта, а реализации, например, стека данных в частной Форт системе!
В разных Форт системах его реализация может существенно отличаться, но он остаётся стэком данных Форт-системы.
Кэширование верхнего элемента стэка в регистре EAX (где то в EBX) один из вариантов,
а может не быть кэширования и стэк данных распологаться на аппаратном стэке процессора, а также другие варианты ...
Есть ещё и стэк возвратов.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Скорость исполнения кода
СообщениеДобавлено: Чт янв 24, 2019 17:35 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
just for lulz
Askalite писал(а):
Стек данных форта и стек данных это не одно и тоже!

Я не буду это комментировать :D

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Скорость исполнения кода
СообщениеДобавлено: Сб янв 26, 2019 01:31 
Askalite писал(а):
Итак, итоги:
В EBP хранится адрес вершины стека данных, указатель на второй элемент стека данных, а первый элемент хранится в EAX.

Всё так. Верхний элемент стека данных кэширован в EAX.

Сейчас я тоже в Каллисто перехожу от простой реализации стека данных «один в один» к кэшированию двух верхних элементов стека в более быстрых операционных регистрах X и Y.

По исследованиям Форта, в которых это разбиралось, выгоду даёт хранение в регистрах одного или двух верхних элементов стека. Хранить в быстрой памяти большее число элементов становится уже не так выгодно.


Вернуться к началу
  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB