views:

573

answers:

7

For using all the cores of a quad core processor what do I need to change in my code is it about adding support of multi threading or is it which is taken care by OS itself. I am having FreeBSD and language I am using is C++. I want to give complete CPU cycles to my application at least 90%.

+10  A: 

For multi-threaded applications in C++ may I suggest Boost.Thread which should help you access the full potential of your quad-core machine.

As for changing your code, you might want to consider making things as immutable as possible. State transitions between threads are much more difficult to debug. There a plethora of things that could potentially happen in unexpected ways. See this SO thread.

wheaties
+3  A: 

I think your only option is to run several threads. If your application is single-threaded, then it will only run on one of the cores (at a time), but if you have more threads, they can run simultaneously.

Andreas Rejbrand
Another option is, as mentioned, run multiple copies of the same program. Depending on the nature of the problem, this may or may not be easy (see http://en.wikipedia.org/wiki/Embarrassingly_parallel ).
KeithB
+1  A: 

You need to add support to your application for parallelism through the use of Threading.

Once you have support for parallelism, it's up to the OS to assign your threads to CPU cores.

Justin Niessner
+8  A: 

Another option not mentioned here, threading aside, is the use of OpenMP available via the -fopenmp and the libgomp library, both of which I have installed on my FreeBSD 8 system.

These give you #pragma directives to parallelise certain loops, while statements etc i.e. the bits you can parallelise. It takes care of threading and cpu association for you. Note it is a general solution and therefore might not be the optimum way to parallelise, but it will allow you to parallelise certain routines.

Take a look at this: https://computing.llnl.gov/tutorials/openMP/

As for using threads/processes themselves, certain routines and ways of working lend themselves to it. Can you break tasks out into such a way? Does it make sense to fork() your process or create a thread? If so, do so, but if not, don't try to force your application to be multi-threaded just because. An example I usually give is the greatest common divisor algorithm - it relies on the step before all the time in the traditional implementation therefore is difficult to make parallel.

Also note it is well known that for certain algorithms, parallelisation is actually slower for small values of whatever you are doing in parallel, because although the jobs complete more quickly, the associated time cost of forking and joining (be that threads or processes) actually pushes the time above that of a serial implementation.

Ninefingers
+16  A: 

You need some form of parallelism. Multi-threading or multi-processing would be fine.

Usually, multiple threads are easier to handle (since they can access shared data) than multiple processes. However, usually, multiple threads are harder to handle (since they access shared data) than multiple processes. And, yes, I wrote this deliberately.

If you have a SIMD scenario, Ninefingers' suggestion to look at OpenMP is also very good. (If you don't know what SIMD means, see Ninefingers' helpful comment below.)

sbi
Was the self-contradiction deliberate? I'd agree, there are advantages/disadvantages to both fork() and threading.
Ninefingers
I thought so. +1.
Ninefingers
+1 for the self-contradiction :-)
Sebastian
SIMD = Single Instruction, Multiple Data. Doing the same thing over multiple data items, basically, like, say, multiplying vectors.
Ninefingers
@Ninefingers: Thanks!
sbi
@sbi No problem. I assume you knew that already, just adding it in for clarity for the OP/others.
Ninefingers
A: 

The first thing I think you should look at is whether your application and its algorithms are suited to be executed in parellel (or possibly as a set of serial tasks that can be processed independently). If this is not the case, it will be difficult to multithread it or break it up into parallel processes, and you may need to look into modifying the way it works.

Once you have established that you will be able to benefit from parallel processing you have the option to either use several processes or threads. The choice depends a lot on the nature of your application and how independent the parallel processes can be. It is easier to coordinate and share data between threads since they are in the same process, but also quite a bit more challenging to develop and debug.

Boost.Thread is a good library if you decide to go down the multi-threaded route.

Chris
+2  A: 

I want to give complete CPU cycles to my application at least 90%.

Why? Your chip's not hot enough?

Seriously, it takes world experts dozens if not hundreds of hours to parallelize and load-balance an application so that it uses 90% of all four cores. Your CPU is already paid for and it costs the same whether you use it or not. (Actually, it costs slightly less to run, electrically speaking, if you don't use it.) How much is your time worth? How many hours are you willing to invest in order to make more effective use of a resource that may have cost you $300 and is probably sitting idle most of the time anyway?

It's possible to get speedups through parallelism, but it's expensive in human time. You need a good reason to justify it. (Learning how is a good enough reason.)

All the good books I know on parallel programming are for languages other than C++, and for good reason. If you want interesting stuff on parallelism check out Implicit Parallel Programmin in pH or Concurrent Programming in ML or the Fortress Project.

Norman Ramsey
Nobody reading this answer will be surprised by my answer to "How are you taking advantage of multicore" http://stackoverflow.com/questions/363341/how-are-you-taking-advantage-of-multicore :-)
Norman Ramsey