2010-08-27 9 views
5

La pregunta es ¿cómo?

¿Necesito bajar al nivel del núcleo para hacer esto, o hay una manera más simple? Para ser más concretos, ¿qué se necesita para implementar un dual-core-merge-sort?

+0

LOL, lo leí como paralizar :-( – SQLMenace

+2

Creo que esta es una pregunta muy real con algunas respuestas excelentes! – Lazer

Respuesta

3

A juzgar por sus preguntas anteriores, diría que está buscando implementar en C/C++, pero creo que la respuesta es más o menos la misma, independientemente del idioma.

Si desea paralelizar cualquier operación, hágalo multiproceso. Puede tener tantos hilos paralelos y concurrentes como núcleos.

Aquí hay una pregunta relacionada: How to implement divide and conquer algorithms in C# using multithreading?

Según tengo entendido, la unión de un hilo en particular a un núcleo o procesador se llama processor affinity. En general, no es una buena idea, porque el propósito del sistema operativo es hacer malabares con los hilos entre los procesadores. Es poco probable que haga un mejor trabajo de esto que el sistema operativo.

+0

Para el paralelismo de grano fino, desea utilizar algún tipo de grupo de subprocesos y no pagar el costo de inicio de nuevos hilos para cada tarea paralela. –

+0

He trabajado bastante con la afinidad del procesador y, créanme, definitivamente pueden hacer un mejor trabajo que el sistema operativo, siempre que analicen correctamente su problema, pero lo mismo es válido para el enhebrado. – NomadAlien

1

Espero que esté buscando la asignación de hilos a cada uno de los núcleos .. Esta es una descripción detallada de lo que se puede hacer y cómo hacerlo.

Processor affinity

Espero que esto ayude.

3

Para implementar un algoritmo que aprovecha múltiples núcleos, considere OpenMP.

Por supuesto, los algoritmos que tienen fuertes dependencias de datos pueden no paralelizarse bien.

+0

Consideraría pthreads y fork() primero ... – polemon

+0

@polemon: ¿Hay alguna razón para esto considerando que OpenMP es generalmente más fácil de usar (al menos para problemas parallizables fáciles, pero como este tema parece estar dirigido a principiantes, eso es (afortunadamente) de lo que estamos hablando) – Grizzly

+0

OpenMP es más adecuado para o paralelismo de grano fino, pthreads para paralelismo menos fino, horquilla para paralelismo de grano algo grueso, y sistemas distribuidos (clusters) para un paralelismo extremadamente tosco. Esta pregunta es bastante precisa, así que creo que estarías loco si usas un tenedor para resolverla. –

0

Si bien los hilos POSIX (pthreads) son probablemente una buena idea para comenzar, esto no es exclusivo.

El subprocesamiento múltiple en C no es realmente trivial, por lo tanto, aconsejaría fork().

inicie una horquilla de trabajador para cada CPU con una subsección de su algoritmo mergesort, y luego vuelva a montarlos en la bifurcación del administrador.

Al trabajar para una solución en paralelo, considero las horquillas antes de las roscas, ya que son más fáciles de implementar y se obtiene un resultado preliminar rápido. Una vez que funcione, es posible que desee tomarse un tiempo y trabajar con pthreads.

Cuestiones relacionadas