Я разработал очень высокопроизводительный, смущающе параллельный код, который будет работать на максимально возможном количестве ядер.Первоначально он работал на 2-ядерном ноутбуке AMD, но когда я перешел на 2-ядерный ноутбук Intel +, улучшение производительности было незначительным: наличие процессора более позднего поколения, еще двух (HT) ядер и 670 МГц более высокая тактовая частота процессора могли простоне быть замеченнымКогда я ограничил код двумя не-HT потоками, неожиданное ускорение в двухъядерном случае внезапно появилось, и я мог дышать легче.
Когда я изменил уровень оптимизации компилятора с 3 на 2 и, наконец,1 гиперпоточность начала показывать свое обещание.Наилучшие результаты были на уровне оптимизации 1 и были примерно на 50% лучше, чем в случае с двумя кодами без HT.
Мне кажется, что слишком хорошо написанный и оптимизированный код использует ядро в максимальной степенив той степени, в которой нет никаких дополнительных доступных ресурсов для выполнения второго потока.Конечно, второй поток будет работать, но два потока будут сталкиваться, когда им нужен один и тот же ресурс.Они будут делать это намного чаще из-за высокого уровня оптимизации.
Благодаря менее оптимизированному или плотному коду у потоков была возможность «чередовать» их доступы к ресурсам ядра в большей степени.Это привело к тому, что два потока выполнялись со скоростью около 75% от скорости, с которой наиболее оптимизированный код работал бы на одном ядре.Если подвести итог, то менее оптимизированный код в двух потоках даст в 1,5 раза пропускную способность наиболее оптимизированного в одном.
Я развил идею написания кода, чтобы увидеть, какой уровень основного ресурса "чередуется", чтоможет быть достигнуто, и я предполагаю, что такой поток будет тратить половину своего выполнения внутреннего цикла в одном канале выполнения процессора и половину в другом.Ожидаемый результат «будет» в том, что один будет выполнять половину внутреннего цикла за другим для достижения наилучшего ресурса «чередования».