13.3 使用OpenMP并行化交叉编译Windows二进制文件

    在这个示例中,我们将交叉编译一个OpenMP并行化的Windows二进制文件。

    我们将使用第3章第5节中的未修改的源代码,示例代码将所有自然数加到N ():

    CMakeLists.txt检测OpenMP并行环境方面基本没有变化,除了有一个额外的安装目标:

    1. # set minimum cmake version
    2. cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
    3. # project name and language
    4. project(recipe-02 LANGUAGES CXX)
    5. set(CMAKE_CXX_STANDARD 11)
    6. set(CMAKE_CXX_EXTENSIONS OFF)
    7. set(CMAKE_CXX_STANDARD_REQUIRED ON)
    8. include(GNUInstallDirs)
    9. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
    10. ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
    11. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY
    12. ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
    13. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY
    14. ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
    15. find_package(OpenMP REQUIRED)
    16. add_executable(example example.cpp)
    17. target_link_libraries(example
    18. OpenMP::OpenMP_CXX
    19. )
    20. install(
    21. TARGETS
    22. example
    23. DESTINATION
    24. ${CMAKE_INSTALL_BINDIR}
    25. )

    通过以下步骤,我们将设法交叉编译一个OpenMP并行化的Windows可执行文件:

    1. 我们将使用与之前例子相同的toolchain.cmake:

    2. CMAKE_CXX_COMPILER设置为对应的编译器(路径)。

    3. 然后,通过CMAKE_TOOLCHAIN_FILE指向工具链文件来配置代码(本例中,使用了从源代码构建的MXE编译器):

      1. $ mkdir -p build
      2. $ cd build
      3. $ cmake -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake ..
      4. -- The CXX compiler identification is GNU 5.4.0
      5. -- Check for working CXX compiler: /home/user/mxe/usr/bin/i686-w64-mingw32.static-g++
      6. -- Check for working CXX compiler: /home/user/mxe/usr/bin/i686-w64-mingw32.static-g++ -- works
      7. -- Detecting CXX compiler ABI info
      8. -- Detecting CXX compiler ABI info - done
      9. -- Detecting CXX compile features
      10. -- Found OpenMP_CXX: -fopenmp (found version "4.0")
      11. -- Found OpenMP: TRUE (found version "4.0")
      12. -- Configuring done
      13. -- Generating done
      14. -- Build files have been written to: /home/user/cmake-recipes/chapter-13/recipe-02/cxx-example/build
    4. 构建可执行文件:

    5. Windows环境下,将看到如下的输出:

      1. $ set OMP_NUM_THREADS=1
      2. $ example.exe 1000000000
      3. number of available processors: 2
      4. number of threads: 1
      5. we will form sum of numbers from 1 to 1000000000
      6. sum: 500000000500000000
      7. elapsed wall clock time: 2.641 seconds
      8. $ set OMP_NUM_THREADS=2
      9. $ example.exe 1000000000
      10. number of available processors: 2
      11. number of threads: 2
      12. we will form sum of numbers from 1 to 1000000000
      13. sum: 500000000500000000
      14. elapsed wall clock time: 1.328 seconds

    我们已经成功地使用一个简单的工具链进行交叉编译了一个可执行文件,并可以在Windows平台上并行执行。我们可以通过设置OMP_NUM_THREADS来指定OpenMP线程的数量。从一个线程到两个线程,我们观察到运行时从2.6秒减少到1.3秒。有关工具链文件的讨论,请参阅前面的示例。

    可以交叉编译一组目标平台(例如:Android),可以参考:https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html