2011-11-07 10 views

Respuesta

15

Sí, existe ese método. Código de "Real World Haskell": http://book.realworldhaskell.org/read/concurrent-and-multicore-programming.html

import GHC.Conc (numCapabilities) 

main = putStrLn $ "number of cores: " ++ show numCapabilities 
+16

Tenga en cuenta que (como dice el libro) esto sólo le da el número de núcleos suministrados a los RTS a través '-N', que no es necesariamente igual a la cantidad de núcleos físicos. – delnan

+0

Es la cantidad de núcleos a los que Haskell tendrá acceso ... ¿qué es lo que realmente quiere el OP? –

+0

@LouisWasserman: Veo casos de uso en los que un programa puede desear utilizar tantos núcleos como se requiera (sin que se le haya otorgado permiso explícito para hacerlo). Alternativamente, alguien puede querer escribir un programa para obtener estadísticas de hardware. – ivanm

5

Se podría Copy'n'Paste this code en un archivo llamado numCores y compilarlo con su código de Haskell. Que se puede utilizar el FFI importar su definición y utilizarlo directamente en el código Haskell:

{-# LANGUAGE ForeignFunctionInterface #-} 
import Control.Applicative ((<$>)) 
import Foreign.C.Types (CInt) 

foreign import ccall "getNumCores" c_getNumCores :: IO CInt 
getNumCores :: IO Int 
getNumCores = fromEnum <$> c_getNumCores 
5

Desde la versión 6.12, GHC RTS includes a function getNumberOfProcessors, que se utiliza para implementar +RTS -N. Puede acceder a él de la misma manera que las funciones extranjeras ordinarias. Advertencia: GHC-solamente y sólo funciona si el programa fue construido con -threaded:

{-# LANGUAGE ForeignFunctionInterface #-} 
import Foreign.C.Types (CInt) 

foreign import ccall "getNumberOfProcessors" c_getNumberOfProcessors :: IO CInt 

main :: IO() 
main = c_getNumberOfProcessors >>= print 

Pruebas:

$ ghc --make -threaded Main.hs 
[1 of 1] Compiling Main    (Main.hs, Main.o) 
Linking Main ... 
$ ./Main      
1 
13

Desde base 4.5 se puede utilizar getNumProcessors de GHC.Conc. Esto es bueno ya que el número de capacidades ahora puede establecerse dinámicamente con setNumCapabilities desde el mismo.

0

Es GHC.Conc.getNumProcessors :: IO Int getNumCapabilities dice cuántos hilos se sugirió a GHC (y depende de +RTS -N opción de parámetros.)

Cuestiones relacionadas