wiki:AppMultiThread

Version 34 (modified by davea, 11 years ago) (diff)

--

Multicore apps

The average number of cores per PC will increase over the next few years, possibly at a faster rate than the average amount of available RAM.

Depending on your application and project, it may be desirable to develop a multi-thread application. Possible reasons to do this:

  • Your application's memory footprint is large enough that, on some PCs, there's not enough RAM to run a separate copy of the app on each CPU.
  • You want to reduce the turnaround time of your jobs (either because of human factors, or to reduce server occupancy).

You may be able to use OpenCL, MPI, OpenMP, CUDA, languages like Titanium or Cilk, or libraries of multi-threaded numerical "kernels", to develop a multi-threaded app.

Initialization

Depending on whether your application uses multiple threads, multiple processes, or both, you will need to call Use the appropriate initialization function.

Waiting for children

In order for BOINC to manage processes correctly, parent processes must always wait for their children to exit before exiting themselves.

Thread priorities

You should set the priority of new threads to that of the main thread.

#ifdef MSVC
#define getThreadPriority() GetThreadPriority(GetCurrentThread())
#define setThreadPriority(num) SetThreadPriority(GetCurrentThread(), num)
#else
#include <sys/resource.h>
#define getThreadPriority() getpriority(PRIO_PROCESS, 0)
#define setThreadPriority(num) nice(num)
#endif

getThreadPriority() is called before forking (by OpenMP in AQUA's case), and setThreadPriority() is then called by each worker thread.

Specifying a plan class

Multicore apps must the plan class mechanism to specify their properties. You may be able to use the predefined "mt" class. Otherwise you must specify your own, using either XML or C++.