Нет, не совсем
Вам придется распараллеливать инструкции любым способом, и многие из них зависят от результатов других инструкций [1]. В дополнение к этому, арифметическая единица (мозг, который действительно вычисляет) обычно не является узким местом.
Для доступа и вычисления данных они должны быть сохранены. Чтобы сделать это быстро, есть несколько уровней памяти (регистры, кэш (уровень 1,2,3), оперативная память). Два ядра (в процессоре x86) обычно разделяют только ОЗУ (и, возможно, кэш-память L3). Таким образом, вы не можете просто разделить программу, потому что другая половина будет иметь необходимые данные.
Как работает Hyperthreading
Гиперпоточность использует время, вычислительный блок ждет чего-то другого.
Загрузка значения из, например, ОЗУ занимает много времени (AFAIK где-то около 500 циклов ЦП). В это время, когда арифметическое устройство обычно ничего не делает, Hyperthreading запускает второй процесс на том же ядре.
[1] Это также точка, где спекулятивное исполнение пытается помочь. И, возможно, создать некоторые дыры в безопасности