можно попробовать заполнить несколько первых значений, а потом размножить с помощью memcpy.
AS>>И каким образом movsd будет быстрее stosd?
A>Я всего-лишь предположил В исходном сообщении не было намеков ни на платформу, ни даже на typeof(data[l]).
F>я наверное чего-то не догоняю, объясните, пожалуйста, если не сложно
F>а как правильный листинг сгенерить с F>rep stosd F>?
Использовать более-менее нормальный компилятор (в мое случае — VC6), оптимизацию на скорость, опция генерить листинг в asm файлы, релиз.
Остальное все по умолчанию (впрочем, оптимизация на скорость в VC6 тоже по умолчанию).
Вроде все
Здравствуйте, Andrew S, Вы писали:
F>>я наверное чего-то не догоняю, объясните, пожалуйста, если не сложно
F>>а как правильный листинг сгенерить с F>>rep stosd F>>?
AS>Использовать более-менее нормальный компилятор (в мое случае — VC6), оптимизацию на скорость, опция генерить листинг в asm файлы, релиз. AS>Остальное все по умолчанию (впрочем, оптимизация на скорость в VC6 тоже по умолчанию). AS>Вроде все
Использую стандартную Visual C++ 6.0
оптимизация на скорость /O2
листинг в asm файлы, релиз.
AS>>Использовать более-менее нормальный компилятор (в мое случае — VC6), оптимизацию на скорость, опция генерить листинг в asm файлы, релиз. AS>>Остальное все по умолчанию (впрочем, оптимизация на скорость в VC6 тоже по умолчанию). AS>>Вроде все
F>Использую стандартную Visual C++ 6.0 F>оптимизация на скорость /O2
Сервис паки ставили? У меня 6-й. До этого еще процессор пак 5-й стоял, но вроде как 6-й сервис пак его убил.
Обманывать мне вас смысла нет — да и смысл, если VC6 генерит именно это, не сам же я такой код нарисовал
AS>В любом случае — перенос почти всегда медленее заливки числом. Если только заранее несколько значений не посчитать в регистры. Но никак не в память.
А кэш?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Andrew S, Вы писали:
AS>>В любом случае — перенос почти всегда медленее заливки числом. Если только заранее несколько значений не посчитать в регистры. Но никак не в память.
E>А кэш?
А он берёт данные из памяти, которая на порядок (!) медленнее. И на больших объёмах данных, память самое узкое место.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, gear nuke, Вы писали:
GN>Здравствуйте, Erop, Вы писали:
E>>Здравствуйте, Andrew S, Вы писали:
AS>>>В любом случае — перенос почти всегда медленее заливки числом. Если только заранее несколько значений не посчитать в регистры. Но никак не в память.
E>>А кэш?
GN>А он берёт данные из памяти, которая на порядок (!) медленнее. И на больших объёмах данных, память самое узкое место.
Если читать в последний раз записанный участок памяти, то наверное он будет в кэше. Я попробовал сравнить обычный цикл с таким копированием на i86. Результаты почти не отличаются. Пробовал копировать пачками по 4 и 8 интов. На спарке это метод заметно медленнее.
Re[15]: Как из этого выжать максимальную скорость?
Здравствуйте, Andrew S, Вы писали:
AS>>>Использовать более-менее нормальный компилятор (в мое случае — VC6), оптимизацию на скорость, опция генерить листинг в asm файлы, релиз. AS>>>Остальное все по умолчанию (впрочем, оптимизация на скорость в VC6 тоже по умолчанию). AS>>>Вроде все
F>>Использую стандартную Visual C++ 6.0 F>>оптимизация на скорость /O2
AS>Сервис паки ставили? У меня 6-й. До этого еще процессор пак 5-й стоял, но вроде как 6-й сервис пак его убил. AS>Обманывать мне вас смысла нет — да и смысл, если VC6 генерит именно это, не сам же я такой код нарисовал
у меня стоит sp6
Вы не могли бы код всей функции привести, пожалуйста, ну типа
Здравствуйте, alnsn
AS>>>>В любом случае — перенос почти всегда медленее заливки числом. Если только заранее несколько значений не посчитать в регистры. Но никак не в память.
E>>>А кэш?
GN>>А он берёт данные из памяти, которая на порядок (!) медленнее. И на больших объёмах данных, память самое узкое место.
A>Если читать в последний раз записанный участок памяти, то наверное он будет в кэше.
Верно, хотя зависит от метода записи в память. Для x86 cуществуют команды, пишущие в обход кеша (компиляторы С их обычно не гененрируют).
A>Я попробовал сравнить обычный цикл с таким копированием на i86. Результаты почти не отличаются. Пробовал копировать пачками по 4 и 8 интов.
Очень многое зависит от объёма копируемых данных. На больших объёмах можно получить выигрыш до 3х раз(пример, для P4 это не очень актуально, поскольку там rep movsd ускорена аппаратно).
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth