Это правильно. Ваша программа не будет работать быстрее (за исключением того факта, что ядро обрабатывает меньше других процессов, поскольку некоторые процессы выполняются на другом ядре), если вы не используете параллелизм. Однако если вы используете параллелизм, большее количество ядер улучшает фактический параллелизм (при меньшем количестве ядер параллелизм чередуется, тогда как при большем количестве ядер вы можете получить истинный параллелизм между потоками).
Обеспечение одновременной эффективной работы программ - непростая задача. Если все сделано плохо, одновременное выполнение вашей программы может замедлить ее! Например, если вы тратите много времени на порождение потоков (создание потоков действительно медленное) и выполняете работу с очень маленьким размером чанка (так что накладные расходы на создание потоков преобладают в реальной работе), или если вы часто синхронизируете свои данные ( который не только заставляет операции выполняться последовательно, но также имеет очень высокие накладные расходы), или если вы часто записываете данные в одной и той же строке кэша между несколькими потоками (что может привести к тому, что вся строка кэша будет аннулирована в одном из ядер), то вы можете серьезно повредить производительности с параллельным программированием.
Также важно отметить, что если у вас N ядер, это НЕ означает, что вы получите ускорение N. Это теоретический предел ускорения. На самом деле, возможно, с двумя ядрами это в два раза быстрее, но с четырьмя ядрами это может быть примерно в три раза быстрее, а затем с восемью ядрами это примерно в три с половиной раза быстрее и т. Д. Насколько хорошо ваша программа на самом деле Возможность использования этих ядер называется параллельной масштабируемостью. Часто накладные расходы на связь и синхронизацию препятствуют линейному ускорению, хотя, в идеале, если вы можете максимально избежать связи и синхронизации, можно надеяться, что вы приблизитесь к линейному.
Невозможно дать полный ответ о том, как писать эффективные параллельные программы в StackOverflow. Это действительно предмет как минимум одного (возможно, нескольких) курсов по информатике. Я предлагаю вам записаться на такой курс или купить книгу. Я бы порекомендовал вам книгу, если бы знал хорошую, но у курса по алгоритмам паралелла не было учебника для курса. Вас также может заинтересовать написание нескольких программ, использующих последовательную реализацию, параллельную реализацию с многопоточностью (обычные потоки, пулы потоков и т. Д.) И параллельную реализацию с передачей сообщений (например, с помощью Hadoop, Apache Spark, Cloud Dataflows). асинхронные RPC и т. д.), а затем измеряя их производительность, варьируя количество ядер в случае параллельных реализаций. Это было основной частью курсовой работы для моего курса по параллельным алгоритмам и может быть довольно проницательным. Некоторые вычисления, которые вы можете попытаться распараллелить, включают вычисление числа Пи с использованием метода Монте-Карло (это тривиально распараллеливается, если вы можете создать генератор случайных чисел, в котором случайные числа, сгенерированные в разных потоках, независимы), выполнение умножения матриц, вычисление формы эшелона строк матрица, суммирующая квадрат числа 1 ... N для некоторого очень большого числа N, и я уверен, что вы можете думать о других.