"это", есть самый оптимальный метод копирование памяти?

Тема в разделе "WASM.A&O", создана пользователем Protorus, 7 мар 2010.

  1. Protorus

    Protorus New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2009
    Сообщения:
    51
    Код (Text):
    1.  cld
    2.  mov    EAX, ECX
    3.  shr     ECX, 2
    4.  rep     movsd
    5.  or      ECX, EAX
    6.  and     ECX, 3
    7.  rep     movsb
    поправьте ..
     
  2. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    По идее, ещё быстрее с использованием инструкций SSE. Но если без них -- вероятно, да. Если известно, чему кратна длина, то можно чуть соптимизировать (например, если всегда кратна 4 байтам, то достаточно rep movsd, если она на 1 больше, чем кратная 4 байтам -- то rep movsd с последующим одиночным movsb и т.д.).
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Нет конечно, нужно учитывать выравнивание памяти(чтобы не попадать между кэш линиями), писать минуя кэш через sse или mmx.
     
  4. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Protorus
    перед ним еще надо что-то вроде:
    Код (Text):
    1.   push ecx
    2.   and ecx,-64
    3.   jecxz copy4
    4. copy64:
    5.   movdqa xmm0,[esi]
    6.   movdqa xmm1,[esi+16]
    7.   movdqa xmm2,[esi+32]
    8.   movdqa xmm3,[esi+48]
    9.   movdqa [edi],xmm0
    10.   movdqa [edi+16],xmm1
    11.   movdqa [edi+32],xmm2
    12.   movdqa [edi+48],xmm3
    13.   sub ecx,64
    14.   lea esi,[esi+64]
    15.   lea edi,[edi+64]
    16.   ja copy64
    17. copy4:  
    18.   pop ecx
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Также желательно использовать инструкцию prefetch, так как атлоны сами не префетчат.
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Black_mirror
    Писать лучше минуя кэш, иначе толку не много.
     
  7. Protorus

    Protorus New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2009
    Сообщения:
    51
    SII: длина за ранее не известна ..
    Booster: о выравнивании заботится тот-кто вызывет этот код (процедуру)
    Black_mirror: возможно длина меньше 64
     
  8. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Protorus
    В общем, надо исходить из наиболее вероятных случаев. Например, если обычно пересылаются короткие текстовые строки, причём их начала выровнены по границе двойного слова (т.е. кратны 4), то наиболее быстрым будет код, подобный Вашему. Если обычно пересылаются достаточно длинные массивы, то выгоднее будет использовать команды SSE: в этом случае самих команд больше, поэтому код окажется медленнее на коротких массивах, но на длинных будет выигрыш из-за более широкого доступа к памяти. Плюс в любом случае надо помнить про выравнивание (я об этом забыл, когда свой первый пост писал): если изначально адрес не кратен нужной величине (4 байта в случае MOVSD и т.д.), то "некратную" часть надо переслать вручную, а затем приступить к быстрой пересылке "кратной" части.
     
  9. Protorus

    Protorus New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2009
    Сообщения:
    51
    Booster
    А как Писать лучше минуя кэш?
    ивиняюсь, за дурацкий вопрос, если что
     
  10. Protorus

    Protorus New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2009
    Сообщения:
    51
    То есть, все улучшения сводятся к оберке "этого" кода, во что-то ..
     
  11. Protorus

    Protorus New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2009
    Сообщения:
    51
    Впрочем "он" сам является оберкой для rep movsb
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Protorus
    MOVNTQ, MOVNTPS.
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    >о выравнивании заботится тот-кто вызывет этот код (процедуру)
    Это внутренняя реализация, о которой вызывающий код не должен знать. По-этому функция должна сама определить выровненный адрес, скопировать до него и потом продолжать копировать с этого адреса.
     
  14. Protorus

    Protorus New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2009
    Сообщения:
    51
    Booster
    да, вы правы ..
     
  15. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Booster
    В общем случае -- да. Хотя в определённых ситуациях может оказаться более целесообразным просто накладывать дополнительное ограничение: адрес должен быть выровнен заранее, и точка. Не выровнял -- твои проблемы, код работать не будет.
     
  16. Protorus

    Protorus New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2009
    Сообщения:
    51
    Кстати, а о выравнивании приемка тоже надо заботиться?
     
  17. Protorus

    Protorus New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2009
    Сообщения:
    51
    Код (Text):
    1.  cld
    2. [b]
    3.  mov     EAX, ESI
    4.  add     EAX, 4
    5.  and     EAX, -4
    6.  sub     EAX, ESI
    7.  xchg    ECX, EAX
    8.  rep     movsb
    9.  or      ECX, EAX
    10. [/b]
    11.  mov     EAX, ECX
    12.  shr     ECX, 2
    13.  rep     movsd
    14.  or      ECX, EAX
    15.  and     ECX, 3
    16.  rep     movsb
    вроде того?
     
  18. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
  19. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Rockphorr
    Гонишь, там тест а не обсуждение.
     
  20. Protorus

    Protorus New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2009
    Сообщения:
    51
    Да, тему можно не продолжать, если бы было, что то получше, нам бы уже сказали..
    Да и MS сама использет примерно такие же строчки в коде ..