2012-03-13 9 views
5

Suponiendo una sola máquina con 8 núcleos. En Haskell, puede compilar utilizando la opción threaded, luego durante el tiempo de ejecución use +RTS -Nx para especificar la cantidad de núcleos que se utilizarán. p.ej.Cómo tomar medidas de F # para obtener aceleraciones

$ myprg args // sequential run 
$ myprg args +RTS -N1 // parallel run on 1..8 cores 
$ myprg args +RTS -N2 
$ myprg args +RTS -N4 
$ myprg args +RTS -N8 

partir de esto, se obtiene utilizando los tiempos de ejecución cada vez mayor número de núcleos, que luego se puede utilizar para obtener aceleraciones y trazar un gráfico.

¿Cómo harías esto en F #, suponiendo que tengo un programa paralelo, p. usando un mapa paralelo en el código?

EDIT: I encontrado que hay ParallelOptions por ejemplo MaxDegreeOfParallelism que puede ser lo que necesito pero no estoy seguro de su comportamiento exacto, y tendría que usarlo programáticamente, lo cual está bien mientras se comporte como se espera, es decir, MaxDegreeOfParallelism = número de núcleos que debería usar el programa y tareas no paralelas 'o hilos.

EDIT: ProcessorAffinity de hecho limita el número de núcleos de usar, pero parece que no se aplica correctamente en Mono. Comprobé en Windows y parece que funciona. Aunque no es realmente una buena idea usar. El sistema de tiempo de ejecución debería poder decidir mejor cómo administrar y programar tareas. Además, MaxDegreeOfParallelism se trata de "nivel de paralelismo" que básicamente establece el número de tareas generadas, por lo que podría utilizarse para variar la granularidad.

+2

Si está utilizando Windows, puede simplemente establecer la cantidad de CPU en un administrador de tareas: http://www.addictivetips.com/windows-tips/how-to-set-processor-affinity-to-an -application-in-windows/ –

+0

Estoy usando Linux/mono. ¿Hay alguna manera de hacer lo mismo en Linux? – vis

+6

F # crea un ensamblado .NET nativo. Un ensamblaje sigue las reglas especificadas para el tiempo de ejecución (CLR), que por defecto tiene afinidad con todos los núcleos de la CPU. Puede limitar CLR por un número de núcleos mínimo configurando 'System.Diagnostics.Process.GetCurrentProcess(). ProcessorAffinity'. – bytebuster

Respuesta

2

F # construye un ensamblado de .NET nativo. Un ensamblaje sigue las reglas especificadas para el tiempo de ejecución (CLR), que por defecto tiene afinidad con todos los núcleos de la CPU. Puede limitar el CLR para menos número de núcleos configurando System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity.

Esta respuesta parece ser incompleta para el entorno Mono. ProcessorAffinity valor is a bit mask, entonces 0 es ciertamente una condición inválida. También me pregunto por qué el colocador no lanzó una excepción como se describe en MSDN.

Yo usaría schedutils para verificar la afinidad mono y también verifico si la bandera del entorno MONO_NO_SMP no está configurada.

2

Para citar el comentario de bytebuster:

F # construye un ensamblado de .NET nativo. Un ensamblaje sigue las reglas especificadas para el tiempo de ejecución (CLR), que por defecto tiene afinidad con todos los núcleos de la CPU. Puede limitar CLR para un número menor de núcleos configurando System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity.

(Si agrega una respuesta dejar un comentario y voy a eliminar este)

+0

Probablemente debería marcar la respuesta como wiki de la comunidad (si no es el autor original). –

+0

@TomasPetricek: Hecho – Guvante

+0

Intenté usar 'ProcessorAffinity', pero no parece haber ninguna diferencia al ejecutar un programa paralelo en una máquina con 8 núcleos. Esperaría que establecer la afinidad en 1,2,4,8 hubiera aumentado las aceleraciones, pero no es el caso. Los tiempos de ejecución siguen siendo los mismos, como si establecer esta propiedad no hiciera ninguna diferencia. ¿Alguna razón por la que esto podría estar pasando? Después de mirar el documento en msdn, estoy pensando que se aplica al procesador físico y no a los núcleos del procesador. – vis

Cuestiones relacionadas