Detect the CPU Core Count From Silverlight
Nov 12, 2009
If you're are writing an application that is heavy on multi-threaded computations (e.g. full screen blur, game, or scientific data processing), you will want to know how many threads to run optimally.
Edit: just fixed a bug reported where the initial assesment woult be 0 msec, thanks Morten for reporting it!
The answer is easy: run as many threads as the CPU cores. For example, on Dual Core, you should run 2 threads and on Quad Core 4 threads.
Download Source Code
This is how to find the number of cores:
- Create a simple computing function (e.g. that adds +1 to a number continuously) and run it with 1, 2, 4, 8, and 16 threads
- Measure the time it takes for the function to complete for each set of threads.
Once you hit the "core limit" of the client system, the time will significantly increase. Here's an example from my box:
- 1 thread: 132 msec
- 2 threads: 111 msec
- 4 threads: 140 msec
- 8 threads: 822 msec
If you look at the above data, you can easily tell I'm running on a quad-core system, because jumping from 4 to 8 threads significanly increases the computational time needed (more than 1.8 times).
This is how to use the source code:
int coreCount = PerformanceMeasure.GetCoreCount();
You can call the above function from the UI thread.
There are also two tweaks in the code that allows it to run roughly at the same speed on all machines and run faster on single-core machines too:
- Once the core limit is hit, the algorithm stops. E.g. if you find that 4 threads take more than 1.8x the time as compared to 2 threads, this means you have 2 cores and there is no need to test with 8 threads
- Before the main algorithm (above) starts, there is an estimation step, which calculates how many operations can be executed for 100 msec on 1 thread. This ensures that the assesment will run fast even on slow machines.
Please comment! I would be interesting to know how well the algorithm works and if it detected your cores as you expected!