2017-01-10 3 views
0

Инструкции памяти, такие как ldr, str или b, выполняют 4 цикла в сборке ARM. Это потому, что каждая ячейка памяти имеет длину 4 байта?Почему инструкции по сборке занимают 4 цикла в сборке ARM?

+0

Зависит от процессора, некоторые ARM-процессоры могут выполнять несколько команд LDR или STR в цикле. –

+1

Нет, вероятно, это не работает (чтение одного байта/цикла, поэтому с 4 циклами), вероятно, это просто латентность для всей операции. – harold

+0

Ширина данных редко делает большую разницу в производительности, так как вы можете «просто» увеличить количество транзисторов, чтобы обрабатывать большую ширину, вместо 8 бит параллельно вы работаете параллельно с 16 или 32. Это стоит «всего» нескольких миллионов миллионных транзисторов по всему ядру, и именно так процессоры двигались через 4, 8, 16, 32 до современных 64-битных (с выделенными 128-512-битными SIMD-командами для дальнейшего распараллеливания). Но сложно «обмануть» (кэш - это один), вся логическая сложность обращения к другому чипу (памяти) от ЦП для извлечения/хранения некоторых данных по шине. Это как путешествие. – Ped7g

ответ

2

ARM имеет конвейерную архитектуру. Каждый тактовый цикл продвигает трубопровод на один шаг (например, fetch/decode/execute/read ...). Поскольку конвейер непрерывно подается, общее время выполнения каждой команды может приближаться к 1 циклу, но фактическое время для отдельной команды от «выборки» до завершения может быть 3+ циклами. ARM имеет хорошее объяснение на своем сайте:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0222b/ch01s01s01.html

Латентность памяти добавляет еще один уровень усложнения этой идеи. ARM использует многоуровневую систему кэширования, целью которой является получение наиболее часто используемых данных в наименьшее количество циклов. Даже чтение из самого быстрого (L0) кэша включает в себя несколько циклов латентности. Конвейер включает средства, позволяющие завершить запросы на чтение позднее, если данные не будут использоваться сразу. Это легче понять на примере:

LDR R0,[R1] 
MOV R2,R3 // Allow time for memory read to occur 
ADD R4,R4,#200 // by interleaving other instructions 
CMP R0,#0 // before trying to use the value 

// By trying to access the data immediately, this will cause a pipeline 
// 'stall' and waste time waiting for the data to become available. 
LDR R0,[R1] 
CMP R0,#0 // Wastes at least 1 cycle due to pipeline not having the data 

Идея заключается в том, чтобы скрыть присущие латентности в трубопроводе и, если вы можете, скрыть дополнительные задержки в доступе к памяти, задерживая зависимости регистров (ака инструкции чередования) ,

+0

Дополнительные пункты? В магазине нет латентности. Кроме того, все быстрее с кешем - это код и данные. Сначала код будет конкурировать с доступом к данным. Существует инструкция «PLD». Филиалы могут усложнять ситуацию. –

+0

@artlessnoise - В основном верно. Есть только 4 буфера записи, которые не объединяют последовательные записи. Плохое использование буферов записи (например, запись по одному байту за раз) также вызовет дополнительные записи при записи. – BitBank