2010-05-18 17 views
18

En un solo procesador, Multithreading aumentará la velocidad del cálculo. Como todos sabemos, el multihilo se usa para aumentar la capacidad de respuesta del usuario y se logra al separar el hilo de la IU y el hilo de cálculo. Pero hablemos solo de la aplicación de la consola. Will multi-threading aumenta la velocidad del cálculo. ¿Obtuvimos el resultado de la culculación más rápido cuando calculamos a través de multi-threading?¿Multiproceso aumentará la velocidad del cálculo en Procesador único

¿qué tal en múltiples núcleos, multihebra aumentar la velocidad o no.

Por favor, ayúdame. Si tiene algún material para aprender más sobre enhebrado. por favor publique.

Editar: Me han hecho una pregunta, en un momento dado, solo se permite ejecutar un subproceso en un solo núcleo. Si es así, ¿por qué las personas usan subprocesos múltiples en una aplicación de consola?

Gracias de antemano, Harsa

+0

El multihilo ha durado más que muchos núcleos. – DanDan

Respuesta

18

En términos generales, no, no se acelerará nada.

Presumiblemente, se está realizando el mismo trabajo en general, pero ahora existe la sobrecarga de subprocesos adicionales e interruptores de contexto.

En un solo procesador con HyperThreading (dos procesadores virtuales), la respuesta es "quizás".

Finalmente, ¿a pesar de que solo hay una CPU quizás algunos de los hilos pueden ser empujados a la GPU u otro hardware? Esto es un poco alejarse del escenario de "un solo procesador", pero técnicamente podría ser una forma de lograr un aumento de velocidad de multihilo en una PC de un solo núcleo.

Editar: su pregunta ahora menciona aplicaciones multiproceso en una máquina multinúcleo. Una vez más, en términos muy generales, esto proporcionará un aumento de velocidad general para su cálculo. Sin embargo, el aumento (o la falta de él) dependerá de cuán paralelizable sea el algoritmo, la contención de memoria y caché, y la habilidad del programador cuando se trata de escribir código paralelo sin problemas de bloqueo o inanición.

+1

Tenga en cuenta que esto vale para tareas intensivas de CPU, para tareas que realizan operaciones de bloqueo (IO enlazado/conversaciones a una base de datos/etc.) Multiproceso puede acelerar las cosas, aunque haciendo operaciones asincrónicas o no bloqueantes puede acelerar cosas más arriba, pero no todas las apis tienen variantes que no son de bloqueo, y las que lo hacen pueden ser más difíciles de programar. – nos

+0

Esto no es completamente cierto, después de todo, hacer compilaciones en paralelo es casi siempre más rápido, sin importar el hardware – Earlz

1

No, no y no.

A menos que escriba código de paralelización para aprovechar las multinúcleas, siempre será más lento si no tiene otras funciones de bloqueo.

+0

Como @coxymla señala que podría haber una CPU con HyperThreading. De hecho, esto podría aumentar la velocidad de ejecución, incluso si la CPU tiene solo un núcleo. –

+0

En realidad, no estás aquí =/ –

+0

Gracias por la respuesta, Olvidemos Multicores por el momento. Me han hecho preguntas como: Si el cálculo no se aceleró, el suero tiene multihilo en un solo núcleo. Les expliqué que, el multihilo es para la capacidad de respuesta, el trabajo relacionado con la comunicación y el DB. Pero muchas personas creen que multi-threading aumenta la velocidad de cálculo. gustaría saber cómo. Gracias por tu tiempo. – Harsha

5

Si la tarea se computa encuadernada, el enhebrado no lo hará más rápido a menos que el cálculo se pueda dividir en múltiples partes independientes. Aun así, solo podrá lograr aumentos de rendimiento si tiene múltiples núcleos disponibles. De fondo en tu pregunta solo agregará sobrecarga.

Sin embargo, es posible que desee ejecutar cualquier cálculo complejo y de larga ejecución en un hilo separado para mantener la aplicación en buen estado.

+0

+1 Para la respuesta simple y sana :) – Rusty

+0

+1 Para la capacidad de respuesta, una aplicación puede aparecer más rápido si el usuario puede interactuar con la aplicación y hacer otras cosas mientras gran cálculo está en progreso. –

7

¿Qué hace su cálculo? No podrá acelerarlo utilizando multithreading si está vinculado a un procesador, pero si por algún motivo su cálculo se escribe en el disco o espera algún otro tipo de IO, es posible que pueda mejorar el rendimiento mediante el uso de subprocesos. Sin embargo, cuando dices "cálculo", supongo que te refieres a algún tipo de algoritmo intensivo en el procesador, por lo que es poco probable que agregar subprocesos ayude, e incluso podría ralentizarte a medida que el cambio de contexto entre los hilos agrega trabajo adicional.

1

Exactamente igual que el ejemplo de entrada de usuario, un hilo puede estar esperando a que se complete una operación del disco, y otros hilos pueden tomar ese tiempo de CPU.

12

pocos hilos en 1 CPU:

  • puede aumentar el rendimiento en caso de continuar con otro hilo en lugar de esperar para I/O operación cota
  • puede disminuir el rendimiento si Digamos que hay demasiados hilos y trabajo se desperdicia en el cambio de contexto

pocos hilos en CPUs N:

  • puede aumentar el rendimiento si puede cortar el trabajo en trozos indentados y procesarlos de manera independiente
  • puede disminuir el rendimiento si se basa principalmente en la comunicación entre hilos y el bus se convierte en un botleneck.

De hecho, es muy específico de la tarea: puede hacer una tarea paralela de una manera muy sencilla, mientras que para otros es casi imposible. Tal vez sea un poco avanzado de lectura para nueva persona, pero hay 2 grandes recursos sobre este tema en C# mundo:

  • Joe Duffy's web log
  • PFX team blog - tienen un conjunto muy biena de artículos para la programación paralela en el mundo .NET incluyendo patrones y prácticas.
1

Más arriba mencionamos.

La ejecución de varios subprocesos en un procesador puede aumentar el rendimiento, si puede lograr hacer más trabajo al mismo tiempo, en lugar de dejar que el procesador espere entre diferentes operaciones. Sin embargo, también podría ser una pérdida grave de rendimiento debido, por ejemplo, a la sincronización o al hecho de que el procesador está sobrecargado y no puede cumplir los requisitos.

En cuanto a núcleos múltiples, el enhebrado puede mejorar significativamente el rendimiento. Sin embargo, mucho depende de encontrar los puntos de acceso y no exagerar. Usar hilos en todas partes y la necesidad de sincronización puede incluso reducir el rendimiento. La optimización del uso de subprocesos con varios núcleos requiere una gran cantidad de estudios previos y planificación para obtener un buen resultado. Necesitará, por ejemplo, pensar en cuántos hilos usar en diferentes situaciones. No desea que los subprocesos se sienten y espere la información utilizada por otro subproceso.

http://www.intel.com/intelpress/samples/mcp_samplech01.pdf
https://computing.llnl.gov/tutorials/parallel_comp/
https://computing.llnl.gov/tutorials/pthreads/
http://en.wikipedia.org/wiki/Superscalar
http://en.wikipedia.org/wiki/Simultaneous_multithreading

+0

Hola Jakob, gracias por publicar la respuesta y el archivo PDF. Tengo un par de solicitudes/preguntas: 1. ¿Tiene algún proyecto de archivos o código fuente, a través del cual se puede aprender multi threading en un solo procesador para aumentar el rendimiento. Si tiene algún material o enlace para esta pregunta. 2. ¿Tiene alguna Guía de enhebrado, cualquier enlace por favor envíeme. 3. ¿Tiene alguna herramienta de depuración de Threading. Gracias por su tiempo y publicar respuesta. – Harsha

+0

¡Hola! Lo siento pero no tengo ningún código fuente. Mucho de lo que decide cómo funciona su programa depende de cómo es la arquitectura de su CPU. No tengo ningún código fuente o herramienta de depuración, lo siento, pero he editado mi publicación con más enlaces. – user373455

0

Incluso una tarea depende de la CPU podría correr más rápido multi-threaded si está bien diseñado para tomar ventaja de la memoria caché y pipelineing realizado por el procesador.Los procesadores modernos pasan mucho tiempo moviendo sus pulgares, incluso cuando nominalmente están "ocupados".

Imagina un proceso que utiliza un pequeño trozo de memoria muy intensamente. Procesar el mismo fragmento de memoria 1000 veces sería mucho más rápido que procesar 1000 fragmentos de memoria similar.

Sin duda podría diseñar un programa de múltiples hilos que sería más rápido que un solo hilo.

0

Las bandas no aumentan el rendimiento. Hilos sacrificio rendimiento a favor de mantener partes del código sensible.

La única excepción es si está haciendo un cálculo que es tan paralelo que puede ejecutar diferentes subprocesos en diferentes núcleos (que es la excepción, no la regla).

1

He estado haciendo algunas ejecuciones intensas de simulación matemática en C++ usando 24 servidores centrales. Si ejecuto 24 simulaciones separadas en paralelo en los 24 núcleos de un solo servidor, entonces obtengo un tiempo de ejecución para cada una de mis simulaciones de, por ejemplo, X segundos.

Lo extraño que he notado es que, cuando se ejecutan solo 12 simulaciones, usando 12 de los 24 núcleos, con los otros 12 núcleos inactivos, entonces cada simulación se ejecuta en un tiempo de ejecución de Y segundos, donde Y es mucho mayor que X! Al ver el gráfico del administrador de tareas del uso del procesador, es obvio que un proceso no se adhiere a un solo núcleo, sino que alterna entre un número de núcleos. Es decir, la conmutación entre núcleos para usar todos los núcleos ralentiza el proceso de cálculo.

La forma en que mantuve el tiempo de ejecución cuando corría solo 12 simulaciones, es ejecutar otras 12 simulaciones "basura" en el lateral, usando los 12 núcleos restantes.

Conclusión: cuando utilice núcleos múltiples, úselos todos al 100%, para un uso menor, el tiempo de ejecución aumenta.

+0

Esa sobrecarga parece proceder de cachés fríos después de que el hilo se haya movido a otro núcleo. Idealmente, el sistema operativo sabría que no tiene sentido mover esos hilos. –

1

Para CPU de un solo núcleo, En realidad, el rendimiento depende del trabajo al que se refiere. En su caso, para el cálculo realizado por la CPU, en ese caso, OverClocking ayudaría si parentBoard lo admite. De lo contrario, no hay forma de que la CPU haga cálculos que son más rápidos que la velocidad de la CPU.

En aras de la CPU multinúcleo Como dicen las respuestas anteriores, si se diseñan adecuadamente el rendimiento puede aumentar, si se utilizan plenamente todos los núcleos.

En la CPU de un solo núcleo, si los subprocesos se implementan en Nivel de usuario, entonces el multithreading no importará si hay llamadas al sistema de bloqueo en la secuencia, como una operación de E/S. Debido a kernel no sabrá sobre los subprocesos de nivel de usuario.

Entonces, si el proceso hace E/S, entonces puede implementar los hilos en el espacio del Kernel y luego puede implementar diferentes hilos para trabajos diferentes. (La respuesta se basa en la teoría)

Cuestiones relacionadas