I have an Intel processor with 8 physical cores (16 with hyper-threading), and I am trying to fully utilize four of these cores by increasing the priority of my C++ application's process and the priority of four threads I am starting in this application (I am using OpenMp to lunch threads).
According to Microsoft's priority table:
| Process priority class | Thread priority level | Base priority |
|---|---|---|
| HIGH_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 1 |
| THREAD_PRIORITY_LOWEST | 11 | |
| THREAD_PRIORITY_BELOW_NORMAL | 12 | |
| THREAD_PRIORITY_NORMAL | 13 | |
| THREAD_PRIORITY_ABOVE_NORMAL | 14 | |
| THREAD_PRIORITY_HIGHEST | 15 | |
| THREAD_PRIORITY_TIME_CRITICAL | 15 | |
| REALTIME_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 16 |
| THREAD_PRIORITY_LOWEST | 22 | |
| THREAD_PRIORITY_BELOW_NORMAL | 23 | |
| THREAD_PRIORITY_NORMAL | 24 | |
| THREAD_PRIORITY_ABOVE_NORMAL | 25 | |
| THREAD_PRIORITY_HIGHEST | 26 | |
| THREAD_PRIORITY_TIME_CRITICAL | 31 |
When I do the following, I only see priority set to 15:
int priority;
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
priority = GetThreadPriority(GetCurrentThread());
Also, checking the priority from the Task Manager, it is set to high, not real-time.
How can I increase the priority to more than 15?
For a default windows installation you need to have Administrator-Privileges to increase the priority class of a process to
REALTIME_PRIORITY_CLASS.The privilege you need to have for this is called
SE_INC_BASE_PRIORITY_NAME:By default this privilege is only given to members of the Administrator Group,
but you can use the Increase scheduling priority group policy to also grant normal users this privilege.
Assuming you're running as a user that has access to said privilege (by default only members of the Administrators Group), and the privilege is enabled for the current process, then you should be able to increase your processes priority to realtime with:
Why Realtime Priority is usually a bad idea
Keep in mind though that realtime priority does really mean realtime.
Almost all system processes run at a lower priority than realtime - so if your process decides to do some heavy computations it'll completely block the rest of your system from doing anything.
Recommended read: When you set a 100% CPU program to real-time priority, you get what you asked for
For almost all tasks its usually best to leave the priority at its default (
NORMAL_PRIORITY_CLASS-THREAD_PRIORITY_NORMAL) - you'll still get plenty of cpu time, but you don't starve out any other applications that also need some.