Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб апр 20, 2024 01:12

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: быстрая пересылка - как лучше следать?
СообщениеДобавлено: Чт июл 03, 2008 16:19 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Необходимо быстро пересылать 8-байтные значения.
адрес приемник - фиксирован, литеральное значение
в параметрах только адрес источник

да, имеется ввиду процы выше PII


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 03, 2008 16:44 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
mOleg писал(а):
Необходимо быстро пересылать 8-байтные значения.
адрес приемник - фиксирован, литеральное значение
в параметрах только адрес источник

Что-то вопрос непонятен. Как это
Вот наводящие ответы
Код:
VARIABLE dest

\ Это так
: MOV1 ( Addr[par] -- )
  A=@A [ dest >CS ] @=A
;

\ Или так
: MOV2 ( par -- )
  [ dest >CS ] @=A
;

STARTLOG
SEE MOV1
SEE MOV2

лог

CODE MOV1 (9 bytes)
5C4E3F 8B00             MOV     EAX , [EAX]
5C4E41 8905284E5C00     MOV     5C4E28  ( dest+5  ) , EAX
5C4E47 C3               RET     NEAR
END-CODE                (3 instructions)


CODE MOV2 (7 bytes)
5C4E5B 8905284E5C00     MOV     5C4E28  ( dest+5  ) , EAX
5C4E61 C3               RET     NEAR
END-CODE                (2 instructions)

Ok

Или совсем не так? :(

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 03, 2008 16:46 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
я думал о вариантах пересылки через FLOAT регистры.
Нужно получить максимально быструю пересылку память-память,
где источник находится по указанному адресу, а приемник по фиксированному.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 03, 2008 16:49 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
chess писал(а):
CODE MOV1 (9 bytes)
5C4E3F 8B00             MOV     EAX , [EAX]
5C4E41 8905284E5C00     MOV     5C4E28  ( dest+5  ) , EAX
5C4E47 C3               RET     NEAR
END-CODE                (3 instructions)

не так. Это четырехбайтная пересылка, а нужна 8 байтная, потому и вопрос возник.

то есть: MOV [#mem], [addr]

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 03, 2008 16:53 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Пардон.

VARIABLE dest

Код:
: MOV1 ( Addr[par] -- )
  bA=@bA [ dest >CS ] @=bA
;

: MOV2 ( par -- )
  [ dest >CS ] @=bA
;

STARTLOG
SEE MOV1
SEE MOV2

лог

CODE MOV1 (9 bytes)
5C4E3F 8A00             MOV     AL , [EAX]
5C4E41 8805284E5C00     MOV     5C4E28  ( dest+5  ) , AL
5C4E47 C3               RET     NEAR
END-CODE                (3 instructions)


CODE MOV2 (7 bytes)
5C4E5B 8805284E5C00     MOV     5C4E28  ( dest+5  ) , AL
5C4E61 C3               RET     NEAR
END-CODE                (2 instructions)


что такое Float регистры?

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 03, 2008 16:55 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
chess писал(а):
что такое Float регистры?

имелись ввиду либо регистры арифметического сопроцессора, либо регистры MMX? SSE?
вобщем изначально 8 байтовые регистры.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 03, 2008 16:56 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
chess писал(а):
CODE MOV1 (9 bytes)
5C4E3F 8A00             MOV     AL , [EAX]

восьмибайтовые, а не восьмибитовые :)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 03, 2008 16:56 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Да что-то заработался я. :( Понял нужны MMX или XMM регистры. Счас сделаю.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 03, 2008 17:02 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
chess писал(а):
Да что-то заработался я. Понял нужны MMX или XMM регистры. Счас сделаю.

вопрос в том, как будет быстрее, потому что растактовка пересылок через эти самые ММХ регистры достаточно нетривиальна, и не понятно, будет ли реальный выигрыш от их использования ?:)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 03, 2008 17:03 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
а замеры времени исполнения с помощью команд RDTSC, оказывается для небольших участков кода не корректны 8(

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 03, 2008 17:24 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Код:
CREATE dest 8 ALLOT

: MOV1 ( Addr[par] -- )
[ dest >CS ] @=M0
;

: MOV2 ( par -- )
[ dest >CS ] M1=@
;

STARTLOG
SEE MOV1
SEE MOV2

лог

CODE MOV1 (8 bytes)
5C5057 0F7F053C505C00   MOVQ    5C503C  ( dest+5  ) , MM0
5C505E C3               RET     NEAR
END-CODE                (2 instructions)


CODE MOV2 (8 bytes)
5C5073 0F6F0D3C505C00   MOVQ    MM1 , 5C503C  ( dest+5  )
5C507A C3               RET     NEAR
END-CODE                (2 instructions


Завтра залью в ~chess - счас уже ухожу.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 04, 2008 08:47 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Залил изменения в ассме для поддержки пересылок в память с использованием ММХ и ХММ регистров
на http://www.chess2007.nm.ru/~chess.zip

Примеры использования
Код:
CREATE src 16 ALLOT  src  16 0x11 FILL
CREATE dst 16 ALLOT
16 ALLOCATE THROW VALUE hdst \ область в куче

\ пересылка 8-и невыровненных байтов из памяти в память
: S->D8
[ src >CS ] M7=@
[ dst >CS ] @=M7
;
: HS->D8
[ src >CS ] M7=@
[ hdst >CS ] @=M7
;
\ пересылка 16-ти невыровненных байтов из памяти в память
: S->D16
[ src >CS ] X0=@
[ dst >CS ] @=X0
;
: HS->D16
[ src >CS ] X0=@
[ hdst >CS ] @=X0
;

REQUIRE METER ~CHESS\TASK\METER.F

STARTLOG
dst 16 0 FILL   S->D8    dst 16 DUMP
hdst 16 0 FILL  HS->D8   hdst 16 DUMP
dst 16 0 FILL   S->D16   dst 16 DUMP
hdst 16 0 FILL  HS->D16  hdst 16 DUMP

SEE  S->D8
SEE HS->D8
SEE  S->D16
SEE HS->D16

METER  S->D8
METER HS->D8
METER  S->D16
METER HS->D16
лог
Код:
5C52A8   11 11 11 11  11 11 11 11  00 00 00 00  00 00 00 00 ................
32828C   11 11 11 11  11 11 11 11  00 00 00 00  00 00 00 00 ................
5C52A8   11 11 11 11  11 11 11 11  11 11 11 11  11 11 11 11 ................
32828C   11 11 11 11  11 11 11 11  11 11 11 11  11 11 11 11 ................

CODE S->D8 (15 bytes)
5C52EB 0F6F3D80525C00   MOVQ    MM7 , 5C5280  ( src+5  )
5C52F2 0F7F3DA8525C00   MOVQ    5C52A8  ( dst+5  ) , MM7
5C52F9 C3               RET     NEAR
END-CODE                (3 instructions)


CODE HS->D8 (15 bytes)
5C530F 0F6F3D80525C00   MOVQ    MM7 , 5C5280  ( src+5  )
5C5316 0F7F3D8C823200   MOVQ    32828C , MM7
5C531D C3               RET     NEAR
END-CODE                (3 instructions)


CODE S->D16 (17 bytes)
5C5333 F3               REPZ
5C5334 0F6F0580525C00   MOVQ    MM0 , 5C5280  ( src+5  )
5C533B F3               REPZ
5C533C 0F7F05A8525C00   MOVQ    5C52A8  ( dst+5  ) , MM0
5C5343 C3               RET     NEAR
END-CODE                (5 instructions)


CODE HS->D16 (17 bytes)
5C535B F3               REPZ
5C535C 0F6F0580525C00   MOVQ    MM0 , 5C5280  ( src+5  )
5C5363 F3               REPZ
5C5364 0F7F058C823200   MOVQ    32828C , MM0
5C536B C3               RET     NEAR
END-CODE                (5 instructions)

386 18
307 18
416 21
46 21

PS. 1. Дизасм СПФ не поддерживает правильное отображение и соответственно счет инструкций с XMM-регистрами
( в данном случае это сойдет)
По скорости понятно эти пересылки будут быстрее чем четырехбайтные в 2 и в 4 раза соответственно.
Для согласования с кэшем данных границы памяти источника и приемника желательно выравнивать на 64 байта в соответствии с размером
строки кэша данных, который тоже равен 64 байтам
(в атлоне-64 и core 2 duo по крайней мере, где кэш данных первого уровня имеет объем 64кбайт и длину строки 64 байта)
2. Измеритель времени METER использует регистры MMX0-MMX2, поэтому не может измерять код, использующий эти регистры.
3. На первое число(латентность), которое выдает измеритель не стоит обращать в этом случае внимание, второе число оценивает производительность
и оно близко к истинному значению.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 04, 2008 14:20 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
гм, вот такой вариант может быть:
MOV EAX, [EBP]
MOV EBX, [EBP+4]
MOV 0x1000 , EAX
MOV 0x1004 , EBX
по времени это будет медленнее, чем через MMX регистры, или нет?

И, как можно определить, например для PIV время исполнения в тактах?
Еще подумалось, будет ли RDTSC более корректно мерять время исполнения кода, если после него будет стоять indirect JMP, и после куска тестируемого кода еще один indirect на RDTSC?

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 04, 2008 15:23 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
В твоем варианте адрес уже помещен в ячейки стека параметров,
но все равно посмотрим без учета времени на то, чтобы его туда загнать

Код:
CREATE addr 8 ALLOT

8 ALLOCATE THROW VALUE addr1

: MOV
  A=@P $ 4 B=@P
  [ addr >CS ]     @=A
  [ addr 4 + >CS ] @=B
;
: MOV1
  A=@P $ 4 B=@P
  [ addr1 >CS ]     @=A
  [ addr1 4 + >CS ] @=B
;


REQUIRE METER ~chess\task\meter.f
STARTLOG
METER MOV
METER MOV1

лог
Код:
398 620
249 18
Ok

Первый вариант долго из-за переписывания кэша при записи в память(проблема для СПФ), правда
я уже попробовал - сделал буфер в 100 кбайт после PAD и там завожу переменные и массивы - все
работает стабильно быстро - так что это обходится.
Второй вариант как и с помощью регистров ММХ(но тут не учтено время заброса адреса на стек параметров).
Но с регистрами ХММ будет все равно в два раза быстрее.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 04, 2008 15:30 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Да еще забыл сказать, что инструкции, которые я использовал работают с невыровненной памятью. Есть аналогичные для работы с выравненной - они гораздо быстрее - но, попробую попозже.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.

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


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

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


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

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