Важная информация

User Tag List

Показано с 1 по 10 из 10

Тема: memcpy|быстрая пересылка данных

  1. #1
    Veteran
    Регистрация
    06.05.2006
    Адрес
    Ливны, Орловская обл
    Сообщений
    1,169
    Благодарностей: 193
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Question memcpy|быстрая пересылка данных

    Допустим нам надо перебросить данные (несколько кб) из одной области памяти(их несколько) в другую(а вот назначение постоянно или,если уж совсем идеально, пара-тройка адресов) и сделать это побыстрее, а памяти потратить на процедуру поменьше(килов до 4х отсилы).
    Какие у нас пути?..
    1) Если хранить данные внутри блоков ld rr,NN : push rr, получим наибыстрейшую загрузку(так ли это?) в 10.5 тактов на байт и эпический жор памяти. Врядли применимо в реальных проектах.
    2) портянка из
    Код:
        ld sp,#src
        pop af
        pop bc
        pop de
        pop hl
        exx
        pop bc
        pop de
        pop hl
        ld sp,#dest
        push hl
        push de
        push bc
        exx
        push hl
        push de
        push bc
        push af
    даст 12.5 тактов на байт, но сожрёт много памяти, а источник выбрать не получится. =\
    3) портянка из pop hl:ld hl,(NN). Удовлетворяет и скоростью и выбором источника, но память жрёт тоже неприемлемо.
    4) красивая макра - хорошая замена LDIR'у, стек не трогает - почти 16t/b и немного памяти, но я хочу быстрее =(
    Код:
        macro ldirf
            xor a
            sub c
            and 128-1
            add a,a
            ld ($+4),a
            jp 1f
            align 256
    1
            dup 128
                ldi
            edup
            jp pe,1b
        endm
    На основе варианта №2 накодил самомодифицирующийся цикл с ~15t/b размером даже меньше варианта №4, можно ли ЕЩЁ быстрее? (Да, пока есть память, можно часть переслать по №3, часть ещё как-то, но вопрос не в этом =))

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

  3. #2
    Veteran Аватар для Hacker VBI
    Регистрация
    05.03.2013
    Адрес
    г. Канев, Украина
    Сообщений
    1,596
    Благодарностей: 916
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    второй вариант в цикле
    "наличие готового программного обеспечения для нового компьютера в наши дни имеет мало смысла."
    "Еще вопрос - почему на Спектруме большинство звуков на AY булькающие ? Как это исправить ?"
    (c) zst

  4. #3
    Veteran
    Регистрация
    06.05.2006
    Адрес
    Ливны, Орловская обл
    Сообщений
    1,169
    Благодарностей: 193
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Hacker VBI, у тебя ведь хватило терпения дочитать до конца? =)
    Я так и сделал, но вышло ~15t/b, может я это сделал криво и есть лучшая реализация?

  5. #4
    Master
    Регистрация
    25.03.2013
    Адрес
    г. Лондон, Великобритания
    Сообщений
    948
    Благодарностей: 645
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    NovaStorm, буквально этот вопрос разжевали неделю назад на WoS: http://www.worldofspectrum.org/forum...ad.php?t=45321
    HackerVBI совершенно прав.
    "introspec" читается как "интроспек". некоторые читают как "интроспец", но я никакой не спец. я спек.

  6. Этот пользователь поблагодарил introspec за это полезное сообщение:
    NovaStorm (01.11.2013)

  7. #5
    Veteran
    Регистрация
    06.05.2006
    Адрес
    Ливны, Орловская обл
    Сообщений
    1,169
    Благодарностей: 193
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    it takes about 13,9 tstates for a byte copy
    Во, вот этото что надо.
    Я пролетел на INC IXH, INC IYH.
    А так этот вопрос-то и у нас обсуждали, но до таких результатов дело не дошло.

  8. #6
    Veteran Аватар для Hacker VBI
    Регистрация
    05.03.2013
    Адрес
    г. Канев, Украина
    Сообщений
    1,596
    Благодарностей: 916
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    NovaStorm, приходится колебаться между скоростью и обьёмом занимаемой памяти. поэтому рекомендую таки тратить капельку тактов на отработку обвязки djnz
    "наличие готового программного обеспечения для нового компьютера в наши дни имеет мало смысла."
    "Еще вопрос - почему на Спектруме большинство звуков на AY булькающие ? Как это исправить ?"
    (c) zst

  9. #7
    Guru
    Регистрация
    03.01.2006
    Адрес
    Рязань
    Сообщений
    2,935
    Благодарностей: 1071
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от NovaStorm Посмотреть сообщение
    Если хранить данные внутри блоков ld rr,NN : push rr, получим наибыстрейшую загрузку(так ли это?) в 10.5 тактов на байт
    Зависит от самих данных. Не все ld в ld: push нужны. А какая задача? В текстовых листалках ld: push вполне юзабельно.
    Взносы в призовой фонд конкурса "Твоя игра 5" принимаются с помощью PaуPal, ЯндексДенег или перевода на карту Сбербанка (см. http://ti5.retropc.ru)

  10. #8
    Guru Аватар для Lethargeek
    Регистрация
    07.09.2005
    Адрес
    Воронеж
    Сообщений
    2,240
    Благодарностей: 218
    Записей в дневнике
    2
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от NovaStorm Посмотреть сообщение
    3) портянка из pop hl:ld hl,(NN). Удовлетворяет и скоростью и выбором источника, но память жрёт тоже неприемлемо.
    смотря где и для чего неприемлемо - емнип так в кустарной переделке под 128K игры Thanatos размотали сразу на весь экран
    Прихожу без разрешения, сею смерть и разрушение...

  11. #9
    Master Аватар для GM BIT
    Регистрация
    27.11.2008
    Адрес
    Красноярск
    Сообщений
    747
    Благодарностей: 230
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от NovaStorm Посмотреть сообщение
    3) портянка из pop hl:ld hl,(NN).
    улыбнуло

    Откуда - источник, куда - приемник
    Если источники разные а приемник один:
    pop hl: ld (NN),hl

    Если источник один а приемники разные:
    ld hl,(NN): push hl

    Если источник один, и приемник один:
    ld hl,nn: push hl
    либо
    ld sp,nn1
    pop hl,de,bc,af
    ld sp,nn2
    push af,bc,de,hl

    Использовать дополнительно exx, ix, iy - это вата, не такой уж и выигрыш в скорости

    В последнем случае возможна нехилая оптимизация если используются повторяющиеся байты
    Быстрее наверное не получится, если не знаешь какие байты ты переносишь

    Если короче то наверное последний вариант в цикле либо куча ldi (тоже как вариант)
    Последний раз редактировалось GM BIT; 02.11.2013 в 16:30.

  12. #10
    Veteran
    Регистрация
    06.05.2006
    Адрес
    Ливны, Орловская обл
    Сообщений
    1,169
    Благодарностей: 193
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    >улыбнуло
    Ах, ну да...
    Это чтобы вражьи агенты не пронюхали. А тут все свои всё поняли. =)
    exx использовать стоит, тк организация цикла жрёт много, а тут за 4+4 такта получаем ещё немного регистров.
    Уже заюзал процедурку, вроде всё пашет, щястя!

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

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

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

Похожие темы

  1. Быстрая буферизация/восстановление в области линии.
    от drbars в разделе Программирование
    Ответов: 12
    Последнее: 14.08.2013, 13:19
  2. Быстрая и медленная память 128к
    от Hacker VBI в разделе Программирование
    Ответов: 21
    Последнее: 27.04.2013, 15:43
  3. Быстрая тригонометрия...
    от ALKO в разделе Программирование
    Ответов: 8
    Последнее: 25.01.2011, 01:29
  4. Мега быстрая загрузка с кассеты???
    от ALEXEY.GORDEEV в разделе Софт
    Ответов: 47
    Последнее: 21.11.2010, 12:06
  5. Ответов: 4
    Последнее: 16.06.2010, 19:37

Ваши права

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