Eso es correcto. Su programa no se ejecutará más rápido (excepto por el hecho de que el núcleo está manejando menos otros procesos, porque algunos de los procesos se están ejecutando en el otro núcleo) a menos que emplee concurrencia. Sin embargo, si usa concurrencia, más núcleos mejoran el paralelismo real (con menos núcleos, la concurrencia se intercala, mientras que con más núcleos, puede obtener un verdadero paralelismo entre los hilos).
Hacer programas concurrentes de manera eficiente no es una tarea sencilla. Si se hace mal, hacer que su programa sea simultáneo puede hacerlo más lento. Por ejemplo, si pasa mucho tiempo generando hilos (la construcción de la secuencia es muy lenta), y trabaja en un tamaño de fragmento muy pequeño (para que la sobrecarga de la construcción de la secuencia domine el trabajo real), o si sincroniza frecuentemente sus datos (que no solo obliga a las operaciones a ejecutarse en serie, sino que también tiene una sobrecarga muy alta) o si escribe frecuentemente en datos en la misma línea de caché entre varios hilos (lo que puede hacer que toda la línea de caché se invalide en uno) de los núcleos), entonces puede dañar seriamente el rendimiento con la programación simultánea.
También es importante tener en cuenta que si usted tiene N núcleos, que no significa que obtendrá un aumento de velocidad de N. Ese es el límite teórico para la aceleración. De hecho, tal vez con dos núcleos es dos veces más rápido, pero con cuatro núcleos puede ser aproximadamente tres veces más rápido, y luego con ocho núcleos es aproximadamente tres veces y media más rápido, etc. Qué tan bien es su programa en realidad capaz de aprovechar estos núcleos se llama escalabilidad paralela.A menudo, la sobrecarga de comunicación y sincronización previene una aceleración lineal, aunque, en el mejor de los casos, si puede evitar la comunicación y la sincronización tanto como sea posible, con suerte puede acercarse a la lineal.
No sería posible dar una respuesta completa sobre cómo escribir programas paralelos eficientes en StackOverflow. Este es realmente el tema de al menos uno (probablemente varios) cursos de informática. Le sugiero que se inscriba en un curso o compre un libro. Te recomendaría un libro si conociera uno bueno, pero el curso de algoritmos paralelos que tomé no tenía un libro de texto para el curso. También podría estar interesado en escribir un puñado de programas utilizando una implementación en serie, una implementación paralela con subprocesamiento múltiple (subprocesos regulares, grupos de subprocesos, etc.) y una implementación paralela con transmisión de mensajes (como Hadoop, Apache Spark, Cloud Dataflows , RPC asíncronas, etc.), y luego midiendo su rendimiento, variando el número de núcleos en el caso de las implementaciones paralelas. Esta fue la mayor parte del trabajo del curso para mi curso de algoritmos paralelos y puede ser bastante perspicaz. Algunos cálculos que puede intentar paralelizar incluyen calcular Pi utilizando el método de Monte Carlo (esto es trivialmente paralelizable, suponiendo que puede crear un generador de números aleatorios donde los números aleatorios generados en diferentes hilos son independientes), realizar la multiplicación de la matriz, calcular la forma escalonada escalonada de una matriz, sumando el cuadrado del número 1 ... N para un número muy grande de N, y estoy seguro de que puedes pensar en otros.
Una CPU multinúcleo se parece a varias CPU de un programa, por lo que siempre que utilice los hilos al máximo, no hay nada más que hacer. ¿A menos que esté buscando consejos sobre cómo mejorar su código de subprocesos múltiples? –
¿Significa que el uso de una mayor cantidad de subprocesos puede mejorar el rendimiento en arquitecturas multinúcleo? –
significa que una arquitectura multinúcleo puede ejecutar la misma cantidad de subprocesos que sus núcleos (el hyper-threading se parece a dos núcleos cada uno) al mismo tiempo. Por lo tanto, teniendo una cantidad de hilos> 1 es aconsejable usar los núcleos. – TomTom