1. 程式人生 > >C++17多核演算法小試

C++17多核演算法小試

咳咳~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的效果!!!