Хорошие ресурсы для использования сборки в Delphi?

Вопрос

Есть ли ресурсы для обучения использованию сборки в Delphi?

Справочная информация

Я нашел и прочитал некоторые общие ссылки на сборку и набор инструкций (x86, MMX, SSE и т. Д.). Но мне сложно применить эту информацию в Delphi. Общие вещи, например, как получить значение свойства класса и т. Д.

Я хотел бы иметь возможность использовать сборку при оптимизации кода.

Я понимаю:

  • Компилятор обыграть будет сложно.
  • Методы оптимизации высокого уровня с гораздо большей вероятностью повысят производительность на несколько порядков по сравнению с оптимизацией сборки низкого уровня. (Например, выбор разных алгоритмов, кеширование и т. Д.)
  • Профилирование жизненно важно. Я использую Sampling Profiler для анализа производительности в реальном мире и подсчет циклов процессора для подробностей низкого уровня.

Мне интересно узнать, как использовать сборку в Delphi, потому что:

  • Не помешает наличие в наборе инструментов еще одного инструмента.
  • Это поможет понять вывод сборки, сгенерированный компилятором.
  • Понимание того, что делает компилятор, может помочь в написании более производительного кода на паскале.
  • Мне любопытно.

person Shannon Matthews    schedule 17.08.2011    source источник
comment
Просто напишите это на ассемблере, и это не ускорит работу. Написание его на сборке умнее / быстрее, чем думал компилятор, возможно. Такие функциональные возможности, как получение свойства класса, скорее всего, не отнимают ваше время, манипуляции со значением свойства - это, вероятно, то, что вы хотите попробовать при сборке.   -  person PtPazuzu    schedule 17.08.2011
comment
Я не думаю, что есть какие-нибудь книги по Delphi-плюс-ассемблеру. Я бы взял значения из свойств класса, используя обычный паскальский код, сохранил результат в локальной переменной, а затем использовал бы ссылку на локальную переменную, например, в моем встроенном ассемблере. Связанный вопрос для общих книг по X86 asm; stackoverflow.com/questions/4845/good-x86-assembly-book   -  person Warren P    schedule 17.08.2011
comment
@PtPazuzu: Ага, цель - манипулирование ценностями. Но сначала это поможет понять основы. В конечном итоге я смотрю на SSE как на источник потенциального ускорения. Delphi вообще не использует инструкции SSE?   -  person Shannon Matthews    schedule 17.08.2011
comment
Для оптимизации стоит прочитать руководства по оптимизации AMD и от Intel. Не зная таких низкоуровневых аппаратных средств (таких как конвейеры, выравнивание, развертывание, параллелизм, предварительная выборка, кеширование и т. Д.), Вы не сделаете свой код (намного) быстрее. Имейте в виду, что в x64 вам придется переписать свой asm (по крайней мере, часть не SSE2) или сделать две его версии.   -  person Arnaud Bouchez    schedule 17.08.2011
comment
@Shannon Delphi не создает инструкций SSE. Вы можете попробовать FPC, который работает (для плавающей запятой). Или дождитесь XE2, который будет использовать SSE2 для вычислений с плавающей запятой в режиме x64. Для обработки звука у вас уже есть некоторые библиотеки Delphi, например code.google.com/p/newac или dsp-worx.de   -  person Arnaud Bouchez    schedule 17.08.2011
comment
@Arnaud: SSE2 в XE2 !! Круто, я этого не знала. Я с нетерпением жду XE2 еще и еще. :) Спасибо за ссылки по оптимизации AMD и Intel.   -  person Shannon Matthews    schedule 17.08.2011
comment
@Shannon - до SSE4.2 (уже в версиях до XE2); еще нет AVX.   -  person PhiS    schedule 24.01.2012


Ответы (5)


Вот ресурс, который может быть полезным ...

www.guidogybels.eu /docs/Using%20Assembler%20in%20Delphi.pdf

(Я хотел добавить комментарий к @Glenn с этой информацией, но вынужден использовать механизм ответов, так как я новичок на этом форуме и недостаточно представителей ...)

person Bob A    schedule 17.08.2011
comment
+1 за упоминание этой замечательной статьи. Я не ожидал, что он все еще будет в сети, поскольку Гвидо, похоже, больше не использует Delphi. - person Rudy Velthuis; 18.08.2011

Большая часть оптимизации включает в себя создание более совершенных алгоритмов: обычно именно там вы можете получить повышение скорости «на порядок».

Мир сборки x64 - это большое изменение по сравнению с миром сборки x86. Это означает, что с введением x64 в Delphi в XE2 (очень скоро) вам придется писать весь свой ассемблерный код дважды.

Получение лучшего алгоритма в Delphi избавляет вас от необходимости писать этот ассемблерный код.

Основная область, в которой может помочь сборка (но часто очень помогает и грамотно созданный код Delphi), - это низкоуровневое вращение бит / байтов, например, при шифровании. С другой стороны, FastMM (менеджер быстрой памяти для Delphi) почти весь код написан на Delphi.

Как уже писал Macro: начало с дизассемблированного кода часто бывает хорошим началом. Но оптимизация сборки может зайти очень далеко.
Примером, который вы можете использовать в качестве отправной точки, является, например, SynCrypto unit, в котором можно использовать либо Delphi, либо ассемблерный код.

person Jeroen Wiert Pluimers    schedule 17.08.2011
comment
+1 за Большая часть оптимизации предполагает создание более совершенных алгоритмов - это главное правило. - person Arnaud Bouchez; 17.08.2011
comment
Я понимаю, что оптимизация обычно лучше всего выполняется с помощью средств высокого уровня, таких как выбор алгоритма, но я не думаю, что это сводит на нет знание того, как использовать сборку в Delphi. - person Shannon Matthews; 17.08.2011
comment
Возможно, лучшее преимущество при создании кода ассемблера не связано с самим алгоритмом (например, плохая быстрая сортировка каждый раз превосходит полностью оптимизированную пузырьковую сортировку). Это имеет отношение к тому, как выражается этот алгоритм. Например, вы можете использовать инструкции ЦП (даже x86), которые Delphi не использует, если они вызываются (отличный пример - ADC). Или вы кодируете таким образом, что сохраняете любые переменные в регистрах. И даже если вы не пишете код на ассемблере, знание этого может быть полезно для создания более быстрого кода Delphi. - person Glenn1234; 17.08.2011

Насколько я понимаю, вы ищете не столько ресурсы ассемблера, сколько ресурсы, чтобы объяснить, как объявления Delphi структурированы в памяти, чтобы вы могли получить к ним доступ через ассемблер. Это действительно сложно найти, но не невозможно.

Вот хороший ресурс, который я нашел, чтобы начать понимать, как Delphi структурирует свои объявления. Поскольку ассемблер задействует только себя с дискретными адресами данных для типов данных, определенных ЦП, вам будет хорошо с любой структурой Delphi, если вы понимаете ее и правильно к ней обращаетесь.

Единственная другая проблема заключается в том, как взаимодействовать с процедурой и заголовками функций Delphi для получения нужных данных (при условии, что вы хотите использовать свой ассемблер с использованием встроенных средств Delphi), но это просто включает понимание стандартных соглашений о вызове функций. Это и this будет полезно с этой целью для понимания их.

Теперь использование реального ассемблера (связанных файлов OBJ) в отличие от встроенного ассемблера - это еще одна тема, которая будет варьироваться в зависимости от выбранного ассемблера. Вы также можете найти информацию об этом, но если у вас есть интерес, вы всегда можете задать этот вопрос.

HTH.

person Glenn1234    schedule 17.08.2011
comment
Спасибо, Гленн! Это именно та информация, которую я ищу! - person Shannon Matthews; 17.08.2011
comment
Есть ли преимущества в использовании связанных файлов OBJ перед встроенной сборкой? (Это должен быть другой вопрос?) - person Shannon Matthews; 17.08.2011
comment
@Shannon Насколько я понимаю, главное преимущество состоит в том, что вы можете получить поддержку инструкций в реальном ассемблере, которых вы не можете получить во встроенном ассемблере Delphi. Как ни странно, у меня никогда не было проблем с встраиванием вызовов реальных функций ассемблера. Это просто зависит от того, получаете ли вы что-то из ассемблерного продукта, что вы не можете получить из самого Delphi. - person Glenn1234; 17.08.2011
comment
FWIW, статью об использовании NASM в качестве внешнего ассемблера для Delphi можно найти здесь: rvelthuis.de /articles/articles-nasm.html - person Rudy Velthuis; 17.08.2011

Чтобы использовать BASM эффективно, вам необходимо знать как (1) как Delphi работает на низком уровне, так и (2) сборку. В большинстве случаев вы не встретите обе эти вещи, описанные в одном месте.

Однако BASM для начинающих Денниса Кристенсена и этот статья о Delphi3000 идет в этом направлении. Для более конкретных вопросов, помимо Stackoverflow, также весьма полезен форум BASM Embarcadero.

person PhiS    schedule 17.08.2011

Самое простое решение - всегда писать его на паскале и смотреть на сгенерированный ассемблер.

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

Хуже того, очень плохо продуманный код ассемблера, плавающий в сети, на самом деле медленнее, чем его эквиваленты на современных процессорах, потому что компромиссы процессоров со временем меняются.


Обновлять:

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

Изучение исходного кода RTL / VCL также может дать представление о том, как получить доступ к определенным конструкциям.

Кстати, не вся оптимизация на низком уровне выполняется с использованием ассемблера. На уровне Паскаля с некоторыми знаниями указателей тоже можно многое сделать, и такие вещи, как оптимизация кеша, иногда также могут выполняться на уровне Паскаля (см., Например, Оптимизация кеширования вращающихся растровых изображений)

person Marco van de Voort    schedule 17.08.2011
comment
Меня не интересует ассемблер для общего кода. Мои приложения обрабатывают звук в реальном времени. Я часто использую плотные петли при работе с самими аудиоданными. В зависимости от фактического приложения, я стремлюсь к использованию ЦП на современном ЦП менее 2-5% (только в разделах реального времени меня не так сильно заботит использование ЦП во время разделов не в реальном времени). Также отмечены все оптимизации. Я ничего слепо не применяю. - person Shannon Matthews; 17.08.2011
comment
Спасибо, Марко. Это чтение по оптимизации кеша интересно. +1 - person Shannon Matthews; 17.08.2011
comment
Лично я думаю, что наиболее актуальный намек для вас находится в первом абзаце. Измените манипуляции с плавающей запятой, например, на 16-битная SIMD с фиксированной точкой с SSE. Я могу представить, что это актуально для вашей цели. И, конечно же, для примеров такие вещи, как Audacity и другие манипуляции со звуком с открытым исходным кодом. Самостоятельно придумывать такие вещи действительно сложно, по крайней мере, до тех пор, пока не наберешься опыта. - person Marco van de Voort; 17.08.2011