
Итак, я ввел команду lscpu
в свой терминал и увидел следующее:
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1
Количество ЦП здесь равно 4 из-за формулы:
No. of CPUs = Sockets X Cores per socket X Threads per Core
Но вопрос в том, что именно представляет собой ЦП? Почему мы включаем потоки в приведенную выше формулу?
решение1
Это зависит от того, что вы ищете.
Когда вы покупаете процессор, на нем четко указано, поддерживает ли он гиперпоточность и количество ядер, а также можно ли использовать его в многопроцессорном режиме (несколько сокетов).
Давайте забудем о случаях, когда у нас есть несколько физических процессоров.
У нас на одном чипе несколько ядер: они могут делить кэш, в противном случае они почти независимы. Но все же: некоторые задачи должны быть скоординированы, поэтому с 4 ядрами у вас (обычно) нет 4-кратной "мощности" одного ядра.
Hyperthreads: это сложнее: это был трюк Intel (также до многоядерности), там можно имитировать несколько CPU. В реальности можно выполнять только один поток за раз, но CPU часто нужно делать паузы (например, ожидание доступа к памяти или записи). С помощью гиперпоточности CPU может быстро переключаться на второй виртуальный CPU.
Таким образом, с помощью гиперпоточности вы часто получаете более высокую производительность по сравнению с одним обычным ЦП, практически без затрат (больше логики, кэша и регистров, но нет дублирующих транзисторов), но два ядра все равно лучше (все еще не равно двум ЦП, но при численных вычислениях, где две задачи полностью независимы, и ядро не будет мешать задачам).
Если у вас параллельные процессы, я бы часто использовал потоки, умноженные на ядра (и часто добавляю единицу к потокам или конечным результатам, если есть дискретное число IO). В этом случае вы получаете лучшую производительность (при условии отсутствия других ресурсоемких задач ЦП): вы используете максимальную мощность, даже когда одно ядро ждет данные памяти.
Но чтобы получить ускорение, я бы просто использовал количество ядер (помня, что у меня будут более качественные данные).
Итак, это зависит от того, что вы ищете. И если вы выполняете сложные задачи, вероятно, вы измеряете гораздо больше своих процессов и оптимизируете их (кэш, память, потоки, ядра, ЦП, MPI, ...). Каждая программа отличается по ресурсам.