The GHC manual gives a few useful flags that control scheduling (not usually necessary) RTS options.
As of version 6.5, GHC supports running programs in parallel on an SMP or multi-core machine. How to do it:
You'll need to get a version of GHC that supports SMP. Either download ghc from CVS or use darcs: darcs get --partial http://darcs.haskell.org/ghc. There are also nightly snapshot distributions available.
All code currently has to be built using the -smp switch, including the libraries. If you downloaded a binary snapshot, then you already have the required libraries. If you build GHC from source, you need to add
GhcLibWays += s
to the file mk/build.mk in the build tree before building.
Compile your program with -smp
Run the program with +RTS -N2 to use 2 threads, for example. You should use a -N value equal to the number of CPU cores on your machine (not including Hyper-threading cores).
Concurrent threads (forkIO and forkOS) will run in parallel, and you can also use the par combinator and Strategies from the Control.Parallel.Strategies module to create parallelism.
Use +RTS -sstderr for timing stats.
Links to related work on parallel and distributed Haskell (many based on GHC)