3. Внутрипроцессорная многопоточность

Для современных компьютеров характерно следующее. Если при запросе к памяти требуемые данные не обнаружены в кэшах первого или второго уровней, то на загрузку слова в кэш уходит длительное время, во время которого конвейер простаивает. Одна из методик решения такой проблемы называется внутрипроцессорной многопоточностью (on-chip multithreading). Она позволяет процессору одновременно управлять несколькими программными потоками, тем самым маскируя простои. Общая идея: если программный поток 1 блокируется, процессор может обеспечить полную загрузку аппаратуры, запустив программный поток 2. В отличие от ILP внутрипроцессорная многопоточность опирается на явное указание параллелизма. Каждый поток характеризуется состоянием (инструкции, данные, значения регистров и т. д.). Существуют следующие способы реализации внтурипроцессорной многопоточности: мелкомодульная, крупномодульная, синхронная

Поток\Такт
Поток 1 1 2 3 4 5 6 7 8
Поток 2 1 2 3 4 5 6 7 8
Поток 3 1 2 3 4 5 6 7 8
Мелкомодульная 1 1 1 2 2 2 3 3 3 4 4 4
Крупномодульная 1 2 1 1 2 3 4 3 4

Мелкомодульная

Простой конвейера маскируется путем исполнения потоков «по кругу», т. е. в смежных тактах они запускаются по циклу. В случае, когда время обращения в память составляет 2 такта, при трех потоках гарантируется полная загрузка аппаратуры. Т.е при простое в n тактов необходимо иметь n+1 поток.

Крупномодульная

В этом случае программный поток А выполняется до тех пор, пока не возникнет простой. При этом теряется один такт. Затем происходит переключение на другую задачу. При переключении потока теряется один такт. Кажется, что крупномодульная многопоточность менее эффективна. Это справедливо для большого числа доступных потоков (n+1), а при малом числе потоков крупномодульная многопоточность оптимальна.

Синхронная

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