<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 2.6 為Eigen庫使能向量化 **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-02/recipe-06 中找到,包含一個C++示例。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 處理器的向量功能,可以提高代碼的性能。對于某些類型的運算來說尤為甚之,例如:線性代數。本示例將展示如何使能矢量化,以便使用線性代數的Eigen C++庫加速可執行文件。 ## 準備工作 我們用Eigen C++模板庫,用來進行線性代數計算,并展示如何設置編譯器標志來啟用向量化。這個示例的源代碼`linear-algebra.cpp`文件: ```c++ #include <chrono> #include <iostream> #include <Eigen/Dense> EIGEN_DONT_INLINE double simple_function(Eigen::VectorXd &va, Eigen::VectorXd &vb) { // this simple function computes the dot product of two vectors // of course it could be expressed more compactly double d = va.dot(vb); return d; } int main() { int len = 1000000; int num_repetitions = 100; // generate two random vectors Eigen::VectorXd va = Eigen::VectorXd::Random(len); Eigen::VectorXd vb = Eigen::VectorXd::Random(len); double result; auto start = std::chrono::system_clock::now(); for (auto i = 0; i < num_repetitions; i++) { result = simple_function(va, vb); } auto end = std::chrono::system_clock::now(); auto elapsed_seconds = end - start; std::cout << "result: " << result << std::endl; std::cout << "elapsed seconds: " << elapsed_seconds.count() << std::endl; } ``` 我們期望向量化可以加快`simple_function`中的點積操作。 ## 如何實施 根據Eigen庫的文檔,設置適當的編譯器標志就足以生成向量化的代碼。讓我們看看`CMakeLists.txt`: 1. 聲明一個`C++11`項目: ```cmake cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(recipe-06 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_STANDARD_REQUIRED ON) ``` 2. 使用Eigen庫,我們需要在系統上找到它的頭文件: ```cmake find_package(Eigen3 3.3 REQUIRED CONFIG) ``` 3. `CheckCXXCompilerFlag.cmake`標準模塊文件: ```cmake include(CheckCXXCompilerFlag) ``` 4. 檢查` -march=native `編譯器標志是否工作: ```cmake check_cxx_compiler_flag("-march=native" _march_native_works) ``` 5. 另一個選項`-xHost`編譯器標志也開啟: ```cmake check_cxx_compiler_flag("-xHost" _xhost_works) ``` 6. 設置了一個空變量`_CXX_FLAGS`,來保存剛才檢查的兩個編譯器中找到的編譯器標志。如果看到`_march_native_works`,我們將`_CXX_FLAGS`設置為`-march=native`。如果看到`_xhost_works`,我們將`_CXX_FLAGS`設置為`-xHost`。如果它們都不起作用,`_CXX_FLAGS`將為空,并禁用矢量化: ```cmake set(_CXX_FLAGS) if(_march_native_works) message(STATUS "Using processor's vector instructions (-march=native compiler flag set)") set(_CXX_FLAGS "-march=native") elseif(_xhost_works) message(STATUS "Using processor's vector instructions (-xHost compiler flag set)") set(_CXX_FLAGS "-xHost") else() message(STATUS "No suitable compiler flag found for vectorization") endif() ``` 7. 為了便于比較,我們還為未優化的版本定義了一個可執行目標,不使用優化標志: ```cmake add_executable(linear-algebra-unoptimized linear-algebra.cpp) target_link_libraries(linear-algebra-unoptimized PRIVATE Eigen3::Eigen ) ``` 8. 此外,我們定義了一個優化版本: ```cmake add_executable(linear-algebra linear-algebra.cpp) target_compile_options(linear-algebra PRIVATE ${_CXX_FLAGS} ) target_link_libraries(linear-algebra PRIVATE Eigen3::Eigen ) ``` 9. 讓我們比較一下這兩個可執行文件——首先我們配置(在本例中,`-march=native_works`): ```shell $ mkdir -p build $ cd build $ cmake .. ... -- Performing Test _march_native_works -- Performing Test _march_native_works - Success -- Performing Test _xhost_works -- Performing Test _xhost_works - Failed -- Using processor's vector instructions (-march=native compiler flag set) ... ``` 10. 最后,讓我們編譯可執行文件,并比較運行時間: ```shell $ cmake --build . $ ./linear-algebra-unoptimized result: -261.505 elapsed seconds: 1.97964 $ ./linear-algebra result: -261.505 elapsed seconds: 1.05048 ``` ## 工作原理 大多數處理器提供向量指令集,代碼可以利用這些特性,獲得更高的性能。由于線性代數運算可以從Eigen庫中獲得很好的加速,所以在使用Eigen庫時,就要考慮向量化。我們所要做的就是,指示編譯器為我們檢查處理器,并為當前體系結構生成本機指令。不同的編譯器供應商會使用不同的標志來實現這一點:GNU編譯器使用`-march=native`標志來實現這一點,而Intel編譯器使用`-xHost`標志。使用` CheckCXXCompilerFlag.cmake`模塊提供的`check_cxx_compiler_flag`函數進行編譯器標志的檢查: `check_cxx_compiler_flag("-march=native" _march_native_works)` 這個函數接受兩個參數: * 第一個是要檢查的編譯器標志。 * 第二個是用來存儲檢查結果(true或false)的變量。如果檢查為真,我們將工作標志添加到`_CXX_FLAGS`變量中,該變量將用于為可執行目標設置編譯器標志。 ## 更多信息 本示例可與前一示例相結合,可以使用`cmake_host_system_information`查詢處理器功能。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看