потому что у двух виртуальных ядер два ALU, но один канал к памяти
немного не так.
проблема в том, что очень небольшое количество кода может утилизировать все ALU и достичь теоретической производительности, т.к. как правило мы ждем чтения из памяти. hyper-threading(smt) нужен для создания еще одного(а то и ещё трёх, как в power) независимого потока инструкций чтобы чем-то нагрузить простаивающие ALU.