Если это не сломалось, не исправляйте это. Это не сломалось.
Основная проблема - это невыровненный доступ. Они переходят от плохого к действительно плохому, в зависимости от того, на какой архитектуре вы работаете. Во многом это связано с программистами, некоторые с компиляторами.
Самый дешевый способ исправить memcpy - не использовать его, выровнять свои данные по хорошим границам и использовать или создать альтернативу memcpy, которая поддерживает только хорошо выровненные, блочные копии. Еще лучше было бы иметь переключатель компилятора, чтобы жертвовать программным пространством и оперативной памятью ради скорости. у людей или языков, которые используют множество структур, таких, что компилятор внутренне генерирует вызовы memcpy или любого другого языкового эквивалента, их структуры будут расти так, что между ними будет отступ или заполнение. 59-байтовая структура может стать 64 байтами вместо этого. malloc или альтернатива, которая только дает указатели на адрес, выровненный как указано. и т. д.
Гораздо проще сделать все это самостоятельно. Выровненный malloc, структуры, кратные размеру выравнивания. Ваш собственный memcpy, который выровнен и т. Д. При том, что это так просто, почему аппаратные ребята испортили бы свои проекты, компиляторы и пользователей? для этого нет бизнес-обоснования.
Другая причина в том, что кэши изменили картину. Ваш драм доступен только в фиксированном размере, 32 бита, 64 бита, что-то в этом роде, любые прямые обращения меньше, чем это огромный удар по производительности. Поместите кеш перед тем, что падение производительности идет вниз, любое чтение-изменение-запись происходит в кеше с возможностью изменения, позволяющим несколько модификаций для одного чтения и записи драм. Вы по-прежнему хотите уменьшить количество циклов памяти для кэша, да, и вы все еще можете увидеть выигрыш в производительности, сгладив его с помощью функции переключения передач (8-битная первая передача, 16-битная вторая передача, 32-битная третья передача, 64 крейсерская скорость, 32 бита вниз, 16 бит вниз, 8 бит вниз)
Я не могу говорить за Intel, но знаю, что такие люди, как ARM, сделали то, что вы просите
ldmia r0!,{r2,r3,r4,r5}
Например,
- это еще четыре 32-битных передачи, если ядро использует 32-битный интерфейс. но для 64-битных интерфейсов, если выровнены по 64-битной границе, это становится 64-битной передачей с длиной два, один набор согласований между сторонами и два 64-битных слова перемещаются. Если он не выровнен по 64-битной границе, он становится тремя передачами: один 32-битный, один 64-битный, а затем 32-битный. Вы должны быть осторожны: если это аппаратные регистры, которые могут не работать в зависимости от конструкции логики регистра, если она поддерживает только 32-битные передачи, вы не можете использовать эту инструкцию для этого адресного пространства. Понятия не имею, почему вы все равно попробуете что-то подобное.
Последний комментарий ... мне больно, когда я это делаю ... ну, не делай этого. Не делайте ни единого шага в копиях памяти. следствием этого является то, что никто не сможет изменить конструкцию аппаратного обеспечения, чтобы упростить для пользователя пошаговую копию памяти, этот вариант использования настолько мал, что его не существует. Возьмите все компьютеры, использующие этот процессор, работающие на полной скорости днем и ночью, по сравнению со всеми компьютерами, выполняющими пошаговое копирование мем-копий и другого оптимизированного по производительности кода. Это похоже на сравнение песчинки с шириной земли. Если вы один шаг, вам все равно придется пройти один шаг, каким бы ни было новое решение, если оно было. чтобы избежать огромных задержек прерываний, настроенный вручную memcpy по-прежнему будет начинаться с if-then-else (если слишком малая копия просто перейдет в небольшой набор развернутого кода или цикла копирования байтов), а затем перейдет в серию блочных копий в некоторая оптимальная скорость без ужасных задержек. Вам все равно придется пройти через это.
чтобы выполнить пошаговую отладку, вам нужно в любом случае скомпилировать запутанный, медленный, кодирующий код. Самый простой способ решения проблемы пошагового решения memcpy - это иметь компилятор и компоновщик, когда ему велено строить для отладки, сборки для и связывания против неоптимизированной memcpy или альтернативной неоптимизированной библиотеки в целом. GNU / GCC и llvm с открытым исходным кодом, вы можете заставить их делать все, что вы хотите.