Можно ли считать поток процессором?

Можно ли считать поток процессором?

Итак, я ввел команду 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, ...). Каждая программа отличается по ресурсам.

Связанный контент