test cpu performance with matrix multiplication

该博客围绕测试CPU计算性能展开。需求是测试CPU计算性能,方法包括用一定规模方阵做乘法运算、依CPU核数开启线程、将任务放入容器后开启线程并统计时间,还采用CPU绑定以减少系统开销。同时给出了相关代码,如cpu_binding.hpp等。

一 需求:

测试cpu计算性能

二 方法:

1.使用一定规模方阵执行乘法运算,不需要保存结果。

2.根据CPU核数开启线程执行乘法运算

3.事先将线程执行任务放入线程对应的任务容器,然后开启线程,统计时间

4.采用cpu绑定,程序没有加锁,几乎没有系统开销。

三 代码

1.cpu_binding.hpp

#ifndef CPU_BINDING_HPP_
#define CPU_BINDING_HPP_
#include <pthread.h>
#include <thread>
using namespace std;
class cpu_binding {
public:
	static cpu_binding &get_instance() {
		static cpu_binding cpu_binding_;
		return cpu_binding_;
	}
	inline int get_cpu_num() const {
		return cpu_num_;
	}
	bool binding(int cpu) {
		if (cpu < 0) {
			return false;
		}
		cpu = (cpu + 1) % cpu_num_;
		if (0 == cpu) {
			return true;
		}
		cpu_set_t cpu_set = {0};
		CPU_SET(cpu, &cpu_set);
		return pthread_setaffinity_np(pthread_self(), sizeof(cpu_set), &cpu_set) >= 0;
	}
private:
	cpu_binding() {
		cpu_num_ = thread::hardware_concurrency();
	}
	virtual ~cpu_binding() = default;
private:
	int cpu_num_;
};

#endif /* CPU_BINDING_HPP_ */

2.cpu_performance_test.hpp

#ifndef CPU_PERFORMANCE_TEST_HPP_
#define CPU_PERFORMANCE_TEST_HPP_
#include <iostream>
#include <vector>
#include <random>
#include <chrono>
#include <functional>
#include "cpu_binding.hpp"
using namespace std;
struct coordinate {
	coordinate(int a = 0, int b = 0) : row(a), col(b) {
	}
	int row;
	int col;
};
class cpu_performance_test {
public:
	static inline cpu_performance_test &get_instance() {
		static cpu_performance_test test;
		return test;
	}
	inline void set_matrix_dimension(int d) {
		matrix_dimension_ = d;
	}
	void init() {
		init_square_matrix(square_matrix0_);
		init_square_matrix(square_matrix1_);
		init_coordinate_array();
		init_threads();
	}
private:
	cpu_performance_test() {
		thread_num_ = thread::hardware_concurrency();
		matrix_dimension_ = 100;
	}
	cpu_performance_test(const cpu_performance_test &) = delete;
	cpu_performance_test & operator = (const cpu_performance_test &) = delete;
	virtual ~cpu_performance_test() {
		join_threads();
	}
private:
	void init_square_matrix(vector<vector<int> >&square_matrix) {
		int number = 0;
		vector<int>matrix_line;
		random_device rd;
		matrix_line.reserve(matrix_dimension_);
		cout << "square matrix as following:" << endl;
		cout << "===============================================" << endl;
		for (int i = 0;i < matrix_dimension_;i++) {
			for (int j = 0;j < matrix_dimension_;j++) {
				number = rd() % 1888;
				matrix_line.emplace_back(number);
				cout << number << " ";
			}
			square_matrix.emplace_back(matrix_line);
			matrix_line.clear();
			cout << endl;
		}
		cout << "===============================================" << endl;
	}
	void init_coordinate_array() {
		corrdinate_array_.resize(thread_num_);
		int loop = 0;
		for (int i = 0;i < matrix_dimension_;i++) {
			for (int j = 0;j < matrix_dimension_;j++) {
				corrdinate_array_[loop].emplace_back(coordinate(i, j));
				cout << "thread id = " << loop << endl;
				cout << "thread task data is " << "(" << i << "," << j << ")" << endl;
				loop = (loop + 1) % thread_num_;
 
			}
		}
	}
	void init_threads() {
		cout << "thread number = " << thread_num_ << endl;
		threads_.resize(thread_num_);
		int thread_id = 0;
		now_ = std::chrono::steady_clock::now();
		for (auto &thread_obj : threads_) {
			thread_obj = thread(bind(&cpu_performance_test::thread_compute, this, thread_id++));
		}
	}
	void join_threads() {
		for (auto &thread_obj : threads_) {
			if (thread_obj.joinable()) {
				thread_obj.join();
			}
		}
		auto end_time = chrono::steady_clock::now();
		chrono::duration<double>time_span = chrono::duration_cast<chrono::duration<double>>(end_time - now_);
		cout << "elapse time = " << time_span.count() << " seconds." << endl;
	}
	void thread_compute(int thread_id) {
		cpu_binding::get_instance().binding(thread_id);
		const auto vec = corrdinate_array_[thread_id];
		int sum = 0;
		for (auto &coordinate_obj : vec) {
			for (int i = 0;i < matrix_dimension_;i++) {
				sum += square_matrix0_[coordinate_obj.row][i] * square_matrix1_[i][coordinate_obj.col];
			}
			sum = 0;
		}
	}
private:
	int thread_num_;
	int matrix_dimension_;
private:
	vector<vector<int> >square_matrix0_;
	vector<vector<int> >square_matrix1_;
	vector<vector<coordinate>>corrdinate_array_;
	vector<thread>threads_;
private:
	chrono::steady_clock::time_point now_;
};
 
#endif /* CPU_PERFORMANCE_TEST_HPP_ */

3.main.cpp

#include "cpu_performance_test.hpp"
int main() {
	cpu_performance_test::get_instance().init();

	return 0;
}

4.make.sh

g++ -std=c++17 -g -o Test main.cpp cpu_performance_test.hpp cpu_binding.hpp -pthread

 

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值