Синхронизация сборки ARM Cortex-M7 на простом контуре задержки — как объяснить результаты?

Поскольку время цикла AFAIK не публикуется, я решил попытаться измерить количество циклов с помощью счетчика DWT на STM32H750-DK; в качестве первого примера я измеряю простую петлю задержки.

Похоже, Cortex-M7 может выполнять две инструкции в каждом цикле. Я бы понял это, если бы они были переведены в 16-битные инструкции. Но результаты показывают то же самое, если я использую регистры R8 и выше, а инструкции переводятся в 32-битные инструкции.

Действительно ли предсказание ветвления играет здесь главную роль? При первом прогоне я получаю больше циклов, но при последующих повторениях замечается добавление 6 циклов независимо от N.

Есть ли где-нибудь еще информация о конвейере Cortex-M7, которая помогла бы объяснить полученные результаты? Я даже не уверен, что результаты имеют смысл. Я правильно интерпретирую эти результаты?

      //-------------- not measured --------------------------
//      ldr r5,=N
// ------------- code under cycle measurement ------
// tloop:  subs r5,r5,#1
//         bne  tloop
// ------------- konec kode ------------------------
/*
// Timings - usually in second or more repetitions
// (on first one cycles are higher in brackets)
╔═══════╤════════════════╗
║ N     │ DWT_CYCCNT(1st)║
╠═══════╪════════════════╣
║ 50    │ 56     (78)    ║
╟───────┼────────────────╢
║ 100   │ 106    (128)   ║
╟───────┼────────────────╢
║ 200   │ 206            ║
╟───────┼────────────────╢
║ 500   │ 506            ║
╟───────┼────────────────╢
║ 1000  │ 1006           ║
╟───────┼────────────────╢
║ 64000 │ 64006 (64028)  ║
╚═══════╧════════════════╝
Comment: difference: R5 instructions are 16-bit, R8 instructions are 32-bit,
         but both with same timing.
         If nop is added, for N=64000, results are 96030 (first run) and 96006.
Conclusion: it seems that branch prediction is the main influencer here.

1 ответ

Вы используете STM32, поэтому есть флэш-кэш и предварительная выборка. Если вы работаете с флэш-памяти, это повлияет на ваши результаты.

Этот конкретный чип также требует состояния ожидания флэш-памяти в зависимости от тактовой частоты и напряжения, что дополнительно влияет на скорость выборки.

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

У Cortex-M7 есть предсказатель ветвления, хотя не уверен, что они используют этот термин, но он есть, и, если я правильно помню, он включен по умолчанию.

Это не ПОС. Мы не смотрим инструкции и не считаем часы, мы пишем приложения и затем профилируем их, если нужно. В частности, на таких архитектурах/ядрах добавление или удаление одной строки кода языка высокого уровня может привести к двузначным процентным изменениям производительности в любом направлении. Люди спорили со мной, что эти ядра на самом деле предсказуемы, и они предсказуемы в том смысле, что одна и та же последовательность кода без других недетерминированных эффектов будет работать одинаковое количество часов, и так оно и будет. Я демонстрировал это много раз. Но добавьте NOP, чтобы изменить выравнивание этого кода, и количество тактов для этого кода может измениться, и это может быть на значительную величину, что приведет к другому, постоянному количеству тактов. Это конвейерные процессоры,

У вас также есть системные эффекты. ARM производит процессорные ядра, IP, а не чипы. Поставщик чипа играет огромную роль в производительности выполнения (то же самое касается x86 — мы уже давно не привязаны к процессору), в том, как обрабатываются эти шины и в IP-адресе для их флэш-памяти и SRAM, которые они покупают, арбитраже и т. д. Таким образом, как указано выше, ST делает вещи, отличные от TI и NXP, в отношении своих продуктов Cortex-M, и все они будут иметь побочные эффекты производительности флэш-памяти, даже с нулевым состоянием ожидания, которое обычно означает половину тактовой частоты процессора. Тот же код во флэш-памяти с отключенными побочными эффектами (придется использовать TI или, возможно, NXP, нельзя сделать это с ST), нулевое состояние ожидания во флэш-памяти, производительность вдвое меньше, чем у SRAM для того же машинного кода, того же выравнивания (при по крайней мере, я видел это на ряде продуктов,

Если ваша цель — проверить, является ли Cortex-M7 суперскейлером, заполните SRAM сотнями инструкций, тысячами. затем зациклите это, один большой массивный цикл, который на 99,99...% составляет тестируемую инструкцию. Отключите предсказание ветвлений и любое кэширование (в этот момент несколько часов предсказания ветвлений действительно должны быть в стирке) и посмотрите, что вы видите. Я прочитал для вас книгу данных и таблицу данных по этому вопросу, но я не стал возвращаться и смотреть, какова производительность SRAM. Высокопроизводительные ядра, такие как ядра ARM, будут иметь чувствительность к системе, выборке, загрузке и сохранению. MCU усугубляют ситуацию с тактовыми доменами, а периферийные устройства — это совсем другое дело (выборка вывода GPIO в цикле не будет такой быстрой, как думает большинство людей).

Компиляторы тоже не знают системы. Они будут выполнять относительную загрузку ПК, чтобы вытащить сложную константу (0x12345678) в регистр вместо расширений Thumb-2, я не могу вспомнить MOVT или что-то в этом роде, загружать половину, а затем загружать половину, 64-битная инструкция, но это линейная выборка, а не остановка, и выполнение одного цикла загрузки из медленной флэш-памяти требует больше тактов. Программисты тоже этого не осознают, если пытаются считать такты для увеличения производительности. Если это ваша конечная цель здесь.

Суть в том, что вы не привязаны к процессору. Вы не можете думать о конвейере, последовательности инструкций и т. д., если только вы не запускаете ядро ​​​​в симуляции и у вас нет идеальной симулированной памяти, в которой шина чтения данных отвечает на шину адреса чтения в первый доступный такт. С этим ядром даже в этой ситуации вы все равно увидите эффекты прогнозирования ветвления и выравнивания строки выборки. При работе с настоящим микроконтроллером у вас всегда возникают проблемы с флэш-памятью, иногда с SRAM, а иногда и с общими проблемами склеивания/реализации чипа.

Другие вопросы по тегам