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.
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/ –
Estoy usando Linux/mono. ¿Hay alguna manera de hacer lo mismo en Linux? – vis
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