FindNVML.cmake done correctly — how to have CMake find Nvidia Management Library (NVML) on Windows and Linux

Nvidia Management Library (NVML) is a powerful API to get and set GPU states. Currently there is a lack of official CMake support. The first couple of google search results point to a script on github, which unfortunately is only partially correct and does not work on Windows. Here we provide a working solution, tested on Scientific Linux 6 and Windows 10, with CUDA 9.1 and CMake 3.11.

The NVML API is spread across several locations:

  • Linux
    • Header: ${CUDA_INCLUDE_DIRS}/nvml.h
    • Shared library: ${CUDA_TOOLKIT_ROOT_DIR}/lib64/stubs/
  • Windows
    • Header: ${CUDA_INCLUDE_DIRS}/nvml.h
    • Shared library: C:/Program Files/NVIDIA Corporation/NVSMI/nvml.dll
    • Import library: ${CUDA_TOOLKIT_ROOT_DIR}/lib/x64/nvml.lib

It is critical to note that, on Windows a dynamic library (.dll) is accompanied by an import library (.lib), which is different from a static library (also .lib). In CMake the target binary should link to the import library (.lib) directly instead of the .dll file. With that, the correct FindNVML.cmake script is shown in listing 1.

Listing 1

# FindNVML.cmake

    string(CONCAT ERROR_MSG "--> ARCHER: Current CUDA version "
                         " is too old. Must upgrade it to 9.1 or newer.")
    message(FATAL_ERROR ${ERROR_MSG})

# windows, including both 32-bit and 64-bit
    set(NVML_NAMES nvml)
    set(NVML_LIB_DIR "${CUDA_TOOLKIT_ROOT_DIR}/lib/x64")

    # .lib import library full path
              NAMES nvml.lib
              PATHS ${NVML_LIB_DIR})

    # .dll full path
              NAMES nvml.dll
              PATHS "C:/Program Files/NVIDIA Corporation/NVSMI")
# linux
    set(NVML_NAMES nvidia-ml)
    set(NVML_LIB_DIR "${CUDA_TOOLKIT_ROOT_DIR}/lib64/stubs")

                 NAMES ${NVML_NAMES}
                 PATHS ${NVML_LIB_DIR})
    message(FATAL_ERROR "Unsupported platform.")

          NAMES nvml.h

find_package_handle_standard_args(NVML DEFAULT_MSG NVML_LIB_PATH NVML_INCLUDE_PATH)

Once find_package(NVML) is called in user CMake code, two cache variables are generated: NVML_LIB_PATH and NVML_INCLUDE_PATH. For Windows, there is an additional NVML_DLL_PATH.

Far cry 5 is bad

This is what a triple A game looks like in 2018? What the fudge?

Story: The writer creates an intriguing start but fails to keep the story convincing and coherent. Many things are illogical or left unexplained. How did Faith and Jacob obtain their mind control ability? How did Joseph foresee the future? If everyone and everything you fight for is shortly to be shattered in pieces, what is the point of fighting and playing this game at all? The game has overdosed on mysticism and nihilism.

Game mechanics: The main quest is concocted from rudely intervening cutscenes and mediocre boss fights. The skirmish against Peggies in side quests is fun to play but feels very repetitive later on due to lack of variation. One of the few memorable fights is where you are tasked with preventing a group of Peggies from defusing the bombs you have planted at their factory; one of the few memorable stash quests is where you have to do a sequence of well timed grapples and jumps in order to loot a stash placed underneath a bridge. Perhaps the best thing is that you can partner with a dog (Boomer), a lion (Peaches) and a bear (Cheeseburger). But that’s all the pros of this game.

Character: Sadly, there’s no memorable character, except for the Marshal who is a joke.

Graphics: Beautifully crafted and highly performance-optimized environment.

Overall, I would rate this game 5/10, and I will not buy a game at full price from Ubisoft next time. Not GG.




By King Crimson (1969)

The wall on which the prophets wrote
Is cracking at the seams
Upon the instruments of death
The sunlight brightly gleams
When every man is torn apart
With nightmares and with dreams,
Will no one lay the laurel wreath
When silence drowns the screams

Confusion will be my epitaph
As I crawl a cracked and broken path
If we make it we can all sit back
And laugh
But I fear tomorrow I’ll be crying,
Yes I fear tomorrow I’ll be crying

Between the iron gates of fate,
The seeds of time were sown,
And watered by the deeds of those
Who know and who are known;
Knowledge is a deadly friend
If no one sets the rules
The fate of all mankind I see
Is in the hands of fools

Lo Wang’s fortune cookie quotes

    • You are not illiterate.
    • Confucius say it is easy to hate and difficult to love. Frankie say relax.
    • Thank you Lo Wang! But your fortune is in another cookie!
    • What’s a seven-letter word for ‘cryptic’?
    • Live each day like it’s your last. Or at least today, because… Oh I don’t want to spoil it.
    • Light travels faster than sound. That’s why some people look brilliant, until you hear them speak.
    • Whoever coined the phrase ‘quiet as a mouse’ never stepped on one.
    • Help! I am being held prisoner in a video game factory.
    • Don’t sweat the petty things and don’t pet the sweaty things. – George Carlin
    • You’re never too old to learn something stupid.
    • All men eat, but Fu Man Chu.
    • Some mistakes are too fun to make only once.
    • With sufficient thrust, pigs fly just fine.
    • He who takes advice from a cookie is sure to crumble.
    • You will stop procrastinating. Later.
    • Cardboard belt is a waist of paper.
    • The difference between an oral thermometer and a rectal thermometer is all a matter of taste.
    • You don’t need a parachute to skydive. You need a parachute to skydive twice.
    • Laugh and the world laughs with you. Cry and the world laughs at you.
    • That’s what ki said.
    • The good news: you’re not paranoid. The bad news: everyone is actually trying to kill you.
    • The early bird gets the worm. The second mouse gets cheese.
    • Small cookies bring great joy.
    • Time is an illusion. Lunchtime doubly so.
    • To be is to do. – Socrates
      To do is to be. – Sarte
      Do be do be do. – Sinatra
    • It is better to have loved and lost than to have had loved and gotten syphilis.
    • Cookie monster wasn’t here.
    • Chew, or chew not. There is no pie.
    • To maintain perfect accuracy, shoot first and call whatever you hit the target.
    • Information is not knowledge. Knowledge is not wisdom. Wisdom is not truth. Truth is not beauty. Beauty is not love. Love is not music. Music is the best. – FZ
    • Man who stand on toilet, high on pot.
    • It is better to have loved and lost than to have loved and got syphilis.


Reference: Shadow Warrior (2013)

Nvidia and Intel both make me furious

Nvidia: Hey, we have now started supporting icc 17.0 since cuda 9.0, but we won’t tell you that this is what you would end up having for your c++11 code:

nvcc warning : The -std=c++11 flag is not supported with the configured host compiler. Flag will be ignored.

Intel: Hey, just want to let you know that we have removed support for Knights Corner accelerators since icc 18. Now you either keep using older icc, or buy a brand new server with our brand new Knights Landing CPU.

And AMD: Sorry that Vega is a let-down, but hey, ours are cheaper!


The correct way of building MPI program using Cmake

[Last update on Feb 18, 2018]

Many posts on this topic appear outdated. Modern cmake is centered around target-specific configurations. A correct way of building MPI program with cmake (version 3.10.2 for instance) would be:

find_package(MPI REQUIRED)
add_executable(my_mpi_bin src1.cpp src2.cpp)
target_include_directories(my_mpi_bin PRIVATE ${MPI_CXX_INCLUDE_PATH} src1.h src2.h)
target_compile_options(my_mpi_bin PRIVATE ${MPI_CXX_COMPILE_FLAGS} my_compile_flags)
target_link_libraries(my_mpi_bin ${MPI_CXX_LIBRARIES} ${MPI_CXX_LINK_FLAGS} my_link_flags)

If the MPI implementation (MPICH-3.2 for instance) is installed at certain location that cmake is unable to find automatically, explicitly specify the path. For example:

cmake \
-DMPI_CXX_COMPILER=/usr/local/mpich-install/bin/mpicxx \
-DMPI_C_COMPILER=/usr/local/mpich-install/bin/mpicc \

MPI_CXX_COMPILER and MPI_C_COMPILER are merely MPI wrappers. They are not the actual compiler/linker. To specify a certain compiler/linker:

cmake \
-DCMAKE_CXX_COMPILER=/usr/local/bin/g++-6.4.0 \
-DCMAKE_C_COMPILER=/usr/local/bin/gcc-6.4.0 \
-DMPI_CXX_COMPILER=/usr/local/mpich-install/bin/mpicxx \
-DMPI_C_COMPILER=/usr/local/mpich-install/bin/mpicc \

*Never ever specify CMAKE_CXX_COMPILER and CMAKE_CXX_COMPILER by hardcoding them in the cmake script. This is such a common anti-pattern.

To create a test for the MPI program:

add_test(NAME my_mpi_test
         my_arg_1 my_arg_2 ...)

*Prior to cmake 3.10.2, use MPIEXEC instead of MPIEXEC_EXECUTABLE.

What phrase is considered toxic but may apply now? — GG EZ


The legend continues


Day 1 is pretty disappointing. rapha lost to cooller without landing a single round; Team Liquid was stomped by 2z; Quakecon venue lost internet connection.

Day 2 is full of amazing matches. rapha managed to win two matches in group stage, and then survived Raisy scare. However, in the quarter final, he lost to his self-effacing teammate dahang. I root for rapha, and hope he will come back stronger next year. cooller continued his invincible state, until surprisingly thwarted by the young talent clawz in the semi final.

Final day, clawz is remembered forever in quake history  as the first player to win the championship of both duel and sacrifice. Everybody was awed, mouth agape. Also being remembered is clawz’s extreme bad manner towards Vo0 and the way he talked in his interview. Guess the kid has a lot to learn.