Как указать время выполнения инструкций x86 и PowerPC?
Я должен приблизить время выполнения кода ассемблера PowerPC и x86. Я понимаю, что не могу точно вычислить, это зависит от многих проблем (текущее состояние процессора - процессор x86 определяет внутренние инструкции в микроинструкциях, время доступа к памяти, получение кода из кеша из более медленной памяти и т. Д.).).
Я нашел некоторую информацию в справочнике по оптимизации Intel (ПРИЛОЖЕНИЕ C), но он не предоставляет информацию обо всех инструкциях общего назначения. Есть ли полная ссылка на это?
А как насчет процессоров PowerPC? Где я могу найти такую информацию?
4 ответа
Это должно быть очень трудно сделать для современной универсальной ОС без чрезмерного строгого контроля среды выполнения или принятия предположений, которые по крайней мере в некоторых случаях будут неверными.
Например: если какой-либо аппаратный ресурс перегружен либо одним очень голодным конкурирующим процессом, либо несколькими конкурирующими процессами, то истекшее время выполнения данного фрагмента кода будет зависеть от того, насколько справедливо ОС может совместно использовать перегруженный ресурс между конкурирующими процессами. Даже если ОС может совершенно справедливо распределить ресурс, вы должны иметь возможность ограничить число конкурирующих процессов, чтобы определить конечный срок.
PowerPC довольно хорошо документирован, но это зависит от того, о каком процессоре вы говорите. IBM сделала довольно хорошее руководство для 970 (G5). Intel немного менее настойчива, когда дело доходит до деталей микроархитектуры.
Тем не менее, то, что вы хотите сделать, довольно сложно. И x86, и PowerPC являются суперскалярными - они имеют несколько исполнительных блоков и конвейеров, так что это не похоже на старые времена, когда вы, возможно, выполняли одну инструкцию за такт. Например, PowerPC 970 может иметь до 215 команд "в полете" в любой момент времени. В идеале вам нужен симулятор, если вы хотите измерить точное количество циклов для небольших участков кода.
Современные процессоры проводят большую часть своего времени в ожидании памяти или в поисках чего-либо, ожидая памяти для своего текущего потока.
Я думаю, что вы должны просто попытаться оптимизировать использование памяти.
Вы должны были бы сделать чрезвычайно строгий анализ. Примите во внимание все кэши, выравнивание, конвейерную обработку, квантование времени и т. Д., И т. Д. И т. Д. Есть ли у x86 даже жесткие тактовые циклы на инструкцию? Лучше просто написать оптимизированный код для скорости в соответствии с рекомендациями руководства по процессору.