2011-11-07 5 views

risposta

15

Sì, esiste un tale metodo. Codice da "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

nota che (come afferma il libro) questo ti dà solo il numero di core in dotazione ai RTS via '-N', che non è necessariamente uguale al numero di core fisici. – delnan

+0

È il numero di core a cui Haskell sarà autorizzato ad accedere ... che è quasi certamente ciò che l'OP vuole realmente? –

+0

@LouisWasserman: Riesco a vedere casi di utilizzo in cui un programma potrebbe desiderare di utilizzare tutti i nuclei necessari (senza essere esplicitamente autorizzato a farlo). In alternativa, qualcuno potrebbe voler scrivere un programma per ottenere statistiche sull'hardware. – ivanm

5

Si potrebbe Copy'n'Paste this code in un file chiamato numCores e compilarlo con il codice Haskell. Che è possibile utilizzare la FFI per importare la sua definizione e utilizzarlo direttamente nel codice 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

A partire dalla versione 6.12, GHC RTS includes a function getNumberOfProcessors, che viene utilizzato per implementare +RTS -N. Puoi accedervi più o meno allo stesso modo delle normali funzioni straniere. Attenzione: GHC-only e funziona solo se il programma è stato costruito con -threaded:

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

foreign import ccall "getNumberOfProcessors" c_getNumberOfProcessors :: IO CInt 

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

Testing:

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

Dal base 4.5 è possibile utilizzare getNumProcessors da GHC.Conc. Questo è buono poiché il numero di funzionalità può ora essere impostato dinamicamente con lo setNumCapabilities.

0

È GHC.Conc.getNumProcessors :: IO Int getNumCapabilities dice quante discussioni sono suggerito di GHC (e dipende +RTS -N parametro opzione.)

Problemi correlati