Many gaming and workstation laptops are available with both (1) integrated power saving and (2) discrete high performance graphics devices. Unfortunately, 3D intensive application performance may suffer greatly if the best graphics device is not selected. For example, a game may run at 30 Frames Per Second (FPS) on the integrated GPU rather than the 60 FPS the discrete GPU would enable. As a developer you can easily fix this problem by adding only one line to your executable’s source code:

extern "C" { _declspec(dllexport) DWORD AmdPowerXpressRequestHighPerformance = 0x00000001; }

Yes, it’s that easy. This line will ensure that the high-performance graphics device is chosen when running your application.

Requirements

It is worth noting some simple requirements for this method to work:

  1. The graphics-intensive application should use either DirectX® or OpenGL®
  2. The laptop should be a legacy PowerXpress or modern Hybrid Graphics laptop with integrated and discrete graphics devices
  3. Executable should be statically linked. Adding the above piece of code in a dynamically linked library will not work.

Generally, modern PC games meet all of the above requirements with few exceptions for light workloads such as MineSweeper and Solitaire.

However, these instructions do not apply to Vulkan™ or OpenCL™ applications. In short, the AMD Vulkan™ Installable Client Driver (ICD) sorts its devices in descending order by a performance heuristic function. Conversely, the AMD OpenCL™ ICD does not sort its devices.

Radeon Additional Settings

Have you ever noticed higher performance while your laptop was Plugged-In to AC wall power? Surprisingly, this may be due to your Radeon Additional Settings!

Switchable Graphics Global Settings

First, users may assign one of the following Global Application Settings to Battery or Plugged-In Power Sources:

  1. Force Power-Saving Graphics
  2. Optimize Power Savings (Battery Default)
  3. Optimize Performance (Plugged-In Default)
  4. Maximize Performance

Consequently, these settings have a very large impact on battery life. Thus, I do not recommend changing these settings.

Switchable Graphics Application Settings

Second, users may assign one of the following Graphics Settings to an application:

  1. High Performance
  2. Power Saving
  3. Based on Power Source
  4. Not Assigned

Conveniently, the graphics driver includes a list of common games and applications — most of which can be changed by the user. Moreover, the user can add applications.

Most noteworthy, the application setting lookup uses only the executable file name, excluding its path. Thus, it is best to avoid generic names or names of other known common applications such as “game.exe”, “player.exe”, or “launcher.exe”.

Thankfully, if the application is “Not Assigned”, then the graphics driver will still test if the executable requested high performance graphics. In practice, the driver searches for “AmdPowerXpressRequestHighPerformance” in the executable’s export table. In fact, you can easily test this yourself using a Microsoft Visual Studio tools command prompt:

dumpbin.exe /exports app.exe | find.exe "AmdPowerXpressRequestHighPerformance"

Switchable Graphics Settings Summary

For simplicity, below is a table for which GPU is selected based global and application settings:

Global SettingApplication SettingSelected GPU
Force Power-Saving GraphicsNot AssignedPower-Saving
 High PerformancePower-Saving
 Power SavingPower-Saving
 Based on Power SourcePower-Saving
Optimize Power SavingsNot AssignedPower-Saving
 High PerformanceHigh Performance
 Power SavingPower-Saving
 Based on Power SourcePower-Saving
Optimize PerformanceNot AssignedPower-Saving
 High PerformanceHigh Performance
 Power SavingPower-Saving
 Based on Power SourceHigh Performance
Maximize PerformanceNot AssignedHigh Performance
 High PerformanceHigh Performance
 Power SavingPower-Saving
 Based on Power SourceHigh Performance

Finally, I have observed applications whose performance increased by 80% simply by adding AmdPowerXpressRequestHighPerformance. Thus, I highly recommend this solution.