C++17多核演算法小試
阿新 • • 發佈:2018-12-10
咳咳~C++11偶還沒吃透呢C++17又來了,這叫我們堅守傳統C++的怎麼活啊T T
先來個單核的看效果:
#include <stddef.h> #include <stdio.h> #include <algorithm> #include <chrono> #include <random> #include <ratio> #include <vector> using std::chrono::duration; using std::chrono::duration_cast; using std::chrono::high_resolution_clock; using std::milli; using std::random_device; using std::sort; using std::vector; const size_t testSize = 1'000'000; const int iterationCount = 5; void print_results(const char *const tag, const vector<double>& sorted, high_resolution_clock::time_point startTime, high_resolution_clock::time_point endTime) { printf("%s: Lowest: %g Highest: %g Time: %fms\n", tag, sorted.front(), sorted.back(), duration_cast<duration<double, milli>>(endTime - startTime).count()); } int main() { random_device rd; // generate some random doubles: printf("Testing with %zu doubles...\n", testSize); vector<double> doubles(testSize); for (auto& d : doubles) { d = static_cast<double>(rd()); } // time how long it takes to sort them: for (int i = 0; i < iterationCount; ++i) { vector<double> sorted(doubles); const auto startTime = high_resolution_clock::now(); sort(sorted.begin(), sorted.end()); const auto endTime = high_resolution_clock::now(); print_results("Serial", sorted, startTime, endTime); } }
Debug結果:
咳咳~我的3612筆記本真的不行了嗎?在公司7700的桌上型電腦是200多的啊。
Release的結果:
看上去快了一個數量級啊!!
接下來是多核版的:
// C17P.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。 // #include "pch.h" #include <iostream> #include "pch.h" #include <iostream> #include <stddef.h> #include <stdio.h> #include <algorithm> #include <chrono> #include <random> #include <ratio> #include <vector> #include <execution> using std::chrono::duration; using std::chrono::duration_cast; using std::chrono::high_resolution_clock; using std::milli; using std::random_device; using std::sort; using std::vector; using std::execution; const size_t testSize = 1'000'000; const int iterationCount = 5; void print_results(const char *const tag, const vector<double>& sorted, high_resolution_clock::time_point startTime, high_resolution_clock::time_point endTime) { printf("%s: Lowest: %g Highest: %g Time: %fms\n", tag, sorted.front(), sorted.back(), duration_cast<duration<double, milli>>(endTime - startTime).count()); } int main() { random_device rd; // generate some random doubles: printf("Testing with %zu doubles...\n", testSize); vector<double> doubles(testSize); for (auto& d : doubles) { d = static_cast<double>(rd()); } // time how long it takes to sort them: for (int i = 0; i < iterationCount; ++i) { vector<double> sorted(doubles); const auto startTime = high_resolution_clock::now(); // same sort call as above, but with par_unseq: sort(std::execution::par_unseq, sorted.begin(), sorted.end()); const auto endTime = high_resolution_clock::now(); // in our output, note that these are the parallel results: print_results("Parallel", sorted, startTime, endTime); } } // 執行程式: Ctrl + F5 或除錯 >“開始執行(不除錯)”選單 // 除錯程式: F5 或除錯 >“開始除錯”選單 // 入門提示: // 1. 使用解決方案資源管理器視窗新增/管理檔案 // 2. 使用團隊資源管理器視窗連線到原始碼管理 // 3. 使用輸出視窗檢視生成輸出和其他訊息 // 4. 使用錯誤列表視窗檢視錯誤 // 5. 轉到“專案”>“新增新項”以建立新的程式碼檔案,或轉到“專案”>“新增現有項”以將現有程式碼檔案新增到專案 // 6. 將來,若要再次開啟此專案,請轉到“檔案”>“開啟”>“專案”並選擇 .sln 檔案
編譯,得到如此結果:
嗯嗯~多核演算法只支援C++17。
我也懶得百度VS2017怎麼使用C++17了,就用老外給的方法,開個2017的工具視窗,輸入
cl /EHsc /W4 /WX /std:c++latest /Fedebug /MDd .\program.cpp
告訴我
好吧,還不能using std::execution。
將26行的
//using std::execution;
遮蔽,再來:
嗯~編譯通過。試試效果:
看到了吧,debug是release的效果!!!