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