当前位置: 首页 > news >正文

HPC: perf入门

如果你想查看你的程序在cpu上运行时,耗时时如何分布的,那么perf是一个合理的选择。

准备工作

为了支持使用perf,首先你要安装相关的库

sudo apt install linux-tools-5.15.0-67-generic

此外,因为使用perf进行benchmark, 涉及到一些系统权限,所以,你还需要修改权限,将下面文档中对应的参数改为-1

vim /proc/sys/kernel/perf_event_paranoid

开始perf

基于stat,我们可以获取程序的统计,包括耗时等。

perf stat ./gemm_cpu

如 图

接下来,通过指令

perf record ./matrix_multiplicationperf report

我们可以获取对应的每个模块的耗时。

值得注意的时,如果函数的计算速度非常快,这里可能不会显示。比如Vectoradd, 相比于gemm。复杂度小了两个级别,这里原本不显示。我是通过增加循环的方式,来让它出现在了上面。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define SIZE 500void initialize_matrix(int matrix[SIZE][SIZE]) {for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {matrix[i][j] = rand() % 100;}}
}void initialize_vector(int vector[SIZE]) {for (int i = 0; i < SIZE; i++) {vector[i] = rand() % 100;}
}void multiply_matrices(int a[SIZE][SIZE], int b[SIZE][SIZE], int result[SIZE][SIZE]) {for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {result[i][j] = 0;for (int k = 0; k < SIZE; k++) {result[i][j] += a[i][k] * b[k][j];}}}
}void vectorAdd(int vec1[SIZE], int vec2[SIZE], int vec[SIZE])
{printf("perform vectoAdd\n");for (int i = 0; i < SIZE; i++)for (int i = 0; i < SIZE; i++)for (int i = 0; i < SIZE; i++){vec[i] = vec1[i] + vec2[i];}
}int main() {int a[SIZE][SIZE], b[SIZE][SIZE], result[SIZE][SIZE];int vec_a[SIZE], vec_b[SIZE], vec_result[SIZE];// Initialize random number generatorsrand(time(NULL));// Initialize matricesinitialize_matrix(a);initialize_matrix(b);// Multiply matricesmultiply_matrices(a, b, result);initialize_vector(vec_a);initialize_vector(vec_b);vectorAdd(vec_a, vec_b, vec_result);#ifdef SHOWREULST// Print a part of the result matrix to verify the operationprintf("Result matrix:\n");for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {printf("%d ", result[i][j]);}printf("\n");}#elseprintf("############### Finish caculation #################\n");
#endifreturn 0;
}

相关文章:

  • 28-unittest批量执行(discover)
  • AI学习指南机器学习篇-决策树的特征选择和分裂准则
  • Linux | 标准IO编程
  • 【传知代码】DETR[端到端目标检测](论文复现)
  • Hash String 学习笔记
  • 简单通用的系统安装、备份、还原方法,支持 ARM 系统【Ventory+FirePE+DiskGenius】
  • 安装node
  • 数据结构笔记2 栈和队列
  • 服务器数据恢复—服务器raid5上层zfs文件系统数据恢复案例
  • java线程池介绍
  • 2024 IDEA最新永久使用码教程(2099版)
  • 前端渲染大量数据思路【虚拟列表】【异步机制】
  • Torrent、Magnet链
  • ASP.NET第五章 Application、Session和Cookie对象
  • Python中包(package)与模块(module)的概念 以及 import 问题
  • Angularjs之国际化
  • HashMap剖析之内部结构
  • Java Agent 学习笔记
  • Java 内存分配及垃圾回收机制初探
  • JS字符串转数字方法总结
  • Just for fun——迅速写完快速排序
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 给新手的新浪微博 SDK 集成教程【一】
  • 后端_MYSQL
  • 技术:超级实用的电脑小技巧
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 如何设计一个比特币钱包服务
  • 如何在 Tornado 中实现 Middleware
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 小程序开发之路(一)
  • 鱼骨图 - 如何绘制?
  • Java数据解析之JSON
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • (9)STL算法之逆转旋转
  • (Forward) Music Player: From UI Proposal to Code
  • (PySpark)RDD实验实战——求商品销量排行
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (八)Flink Join 连接
  • (八)Spring源码解析:Spring MVC
  • (二)测试工具
  • (二)原生js案例之数码时钟计时
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • .gitattributes 文件
  • .gitignore文件---让git自动忽略指定文件
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET中的十进制浮点类型,徐汇区网站设计
  • [ C++ ] STL---string类的模拟实现
  • [1181]linux两台服务器之间传输文件和文件夹
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记