Сервер - статьи

       

Проблемы современных архитектур


Как правило, очень многие инструкции зависимы: будучи однажды определенными, они используются в циклах, математических операциях, условиях. Причем независимость операндов определяется только при исполнении. Часто конвейеру приходится простаивать в ожидании данных с другого исполнительного блока или из памяти - на это может уйти около 5 тактов. Получить результат за меньшее количество тактов можно - в таком случае используется предсказание ветвлений. Однако это не идеальный выход: при ошибке ветвления приходится перегружать весь конвейер заново. Чтобы инструкции были независимыми, их надо отдельно объявлять, но это, в свою очередь, увеличивает размер исполняемого кода. Современные компиляторы по умолчанию не могут реализовать параллелизм. Некоторая параллельность выполнения реализуется прямо во время компиляции, что далеко от идеала. Такой параллелизм позволяет одновременно выполнять лишь операции одного блока кода (например, одну функцию). Больше всего параллелизму мешают условные переходы, которые встречаются в современных программах очень часто. Переходы не только нарушают последовательность выполнения команд, но и требуют параллельного исполнения заранее для определения исключений.

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

В современных языках программирования (C++, Java) часто применяются вызовы небольших функций и процедур, которые требуют частой передачи и возврата значений. Для вызывающей и вызываемой функций используются одни и те же регистры, соответственно, их содержание требуется сохранять в памяти. Иногда сохранение и восстановление регистров производится, даже если это и не требуется.

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

Содержание раздела







Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий