自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 使用perf优化cache利用率(矩阵乘法)

(一般而言,每个分块矩阵的大小应该小于等于缓存大小,并且要尽可能接近缓存行大小,最大程度利用缓存的局部性)根据程序局部性的特点,很快发现这段代码最底层的data[k*b->cols+j]具有不良的空间局部性,每次都要跨b->cols个单元访问下一个元素,这会导致数据不断从内存移向缓存,增加很多不必要的数据传输时间。仔细观察上面普通矩阵相乘的算法,可以发现三个for循环之间并没有严格的先后关系,故我们可以改变for循环的顺序,使最底层的代码具有良好的局部性。按照数学上的思路,我们习惯用如下矩阵相乘的写法。

2023-10-29 10:34:44 237

原创 并发控制:线程的同步与互斥

自旋锁是一种忙等待的锁,线程在尝试获取锁时会不断地循环检查锁的状态,直到成功获取锁为止。自旋锁适用于锁的持有时间很短的情况,因为它不会使线程进入阻塞状态,减少了线程切换的开销。但是,如果锁的持有时间较长或竞争激烈,自旋锁可能会导致线程占用过多的CPU资源。好处:lock成功,立即进入临界区,开销小坏处:lock失败,浪费cpu自旋等待互斥锁是一种阻塞锁,线程在尝试获取锁时如果锁已经被其他线程占用,则会被阻塞,直到锁被释放后才能继续执行。

2023-09-21 21:16:30 213

原创 理解进程和线程

进程(Process)是指一个正在执行的程序实例,拥有独立的地址空间和资源,是操作系统进行资源分配和调度的基本单位。线程(Thread)是进程内的一个执行单元,它与同一进程内的其他线程共享进程的地址空间和资源。总而言之:进程=资源+指令,线程=指令,可以看出线程是进程中实施调度和分派的基本单位。

2023-08-16 13:20:44 120 1

原创 Bomb Lab

首先可得到相对偏移量从0x0到0x14,间隔为4的6个空间,第二个框大概率是格式字符串的地址(可由x/s 0x4025c3结果验证),第三个框大概是程序计数器(0~5间6个数,验证是否输入6个数,目的也在此)。由于%esi的值已知,执行。由的语句可得,此时%eax的值必然等于(%rbx),即该开辟的栈中地址倒二小的位置数据为2。由的语句可得,此时(%rsp)必然等于1,即该开辟的栈中地址最小的位置数据为1。

2023-08-14 12:11:14 143

原创 ATT汇编

本篇博文为学习《深入理解计算机系统》过程中写的笔记,其中一些图片也摘自本书。

2023-08-13 13:24:29 344 1

原创 决策树ID3算法(c++/cmake/Linux)

①把训练数据集practice_data.txt引入名为samples的二维数组,再把samples分为4个部分(2个vector和2个map)由于找不到合适的数据集,两组离散型数据集均为python随机产生,因此结果可能产生较大误差。②把测试数据集test_data.txt引入名为test_samples的二维数组。最后,切换到tree目录下,执行命令。

2023-08-02 12:09:32 96

原创 C++图像平滑处理(中值滤波、高斯滤波、均值滤波),并用cmake和git管理工程

SHELL.sh:(shell脚本实现自动化编译运行)opencv官网链接。

2023-05-06 01:03:10 248

原创 HPL测试

HPL(The High-Performance Linpack Benchmark)是测试高性能计算集群系统浮点性能的基准程序。HPL通过对高性能计算集群采用高斯消元法求解一元N次稠密线性代数方程组的测试,评价高性能计算集群的浮点计算能力。

2023-04-09 19:54:43 3044

原创 函数的递归调用(C++)

现在要将塔座A上的这叠盘子移到塔座C上,并仍按同样顺序放置,且在移动的过程中遵循规则:①每次只能移动一个圆盘;C++语言允许函数递归调用,如图(a)所示为直接递归调用,如图(b)所示为间接递归调用。可以发现,第7行和第8行两次调用Hanoi()分别做递归,而第五行的if(n==1)…思考:不论n为多少,移动的过程都受前一块盘子移动的决定,且满足一定的规律,故用递归解决。的格式书写,所以书写递归时,尽量以这个格式去考虑,而if(){}的决定起到关键作用。出栈:f(1)f(2)f(3)…——能够写出推导公式。

2023-02-22 23:26:03 957

原创 稀疏矩阵向量乘法

稀疏矩阵向量乘(SpMV)把一个稀疏矩阵与一个向量相乘。稀疏矩阵是指矩阵中大部分元素为0的矩阵。这里的向量本身也可是稀疏的,但通常情况下是密集的。作为一种通用的运算,在科学应用、经济模型、数据挖掘、信息检索中广泛应用。例如,在利用迭代法求解稀疏线性方程组和特征值的问题。同时,也被应用于网页搜索排名和计算机视觉(图像重构等)。

2023-02-18 12:28:06 1950

原创 用OpenMP对矩阵乘法运算进行优化

使用parallel for,只会把最外层的循环分给不同的线程,同一个外层循环的内层的循环只能由一个线程执行,要想实现同一个外层循环的内层循环也被多个线程执行,我们可以写循环的时候,内层循环写成:for (int j = 0;后来发现原因挺简单的,就是在双重循环的时候,假如第一层是遍历 i,第二层是遍历 j,这个 j 如果是omp_set_num_threads()之前声明的,就说明 j 被多个线程共用,那么可能这个线程正在使用 j,然后被另一个线程更改了。对于稀疏矩阵,可以采用CSR法对数据进行储存。

2023-02-17 23:58:45 1016

原创 OpenMP并行编程学习

可以说OpenMP制导指令将C语言扩展为一个并行语言,但OpenMP本身不是一种独立的并行语言,而是为多处理器上编写并行程序而设计的、指导共享内存、多线程并行的编译制导指令和应用程序编程接口(API),可在C/C++和Fortran中应用,并在串行代码中以编译器可识别的注释形式出现。OpenMP标准是由一些具有国际影响力的软件和硬件厂商共同定义和提出。

2023-02-17 22:21:31 190

原创 向量化优化

向量化优化借助的是 CPU 的 SIMD 指令,即通过单条指令控制多组数据的运算。它被称为 CPU 指令级别的并行。区别:标量指令与向量指令●标量指令,每次处理一 个数据●又称传统指令和通用指令●向量指令,每次处理一批数据●也叫SIMD指令(Single Instruction Multiple Data),单指令,多数据●很多应用需要这种细粒度的并行性(比如,典型的多媒体应用)

2023-02-15 14:04:57 993

原创 Shell编程学习及相关作业解答

SHELL1:编写一个shell脚本(SHELL1.sh)以输出一个文本文件 a.txt 中的行数SHELL2:查看日志的时候,经常会从文件的末尾往前查看,请编写一个shell脚本以输出一个文本文件 a.txt 中的最后5行SHELL3:编写shell脚本,实现对后台CPU使用率的的监控,并将CPU利用率前三的进程信息存储到文件中

2023-02-03 23:10:56 281

原创 在虚拟机内的linux环境下编译运行C++

在虚拟机内的linux环境下编译运行C++

2022-12-04 22:37:42 5884

原创 中缀表达式转换成后缀表达式

中缀表达式转换成后缀表达式

2022-12-04 22:35:57 1456

原创 C++设计单链表习题及解答

C++设计单链表习题及解答

2022-12-04 22:33:54 677

原创 C++初级习题及解答

1、输入自己的个人信息(学号,姓名,专业,性别等)并输出控制台。2、设计一个程序,实现判断是否是闰年3、输入一个正整数,反转这个数字,例如输入123,输出321.4、输入两个整数,求两个给定正整数的最大公约数和最小公倍数。5、输出前1000的素数6、给出 n,输出杨辉三角的前 n行。7、统计单词数,输入一个要查询的单词,以及一段英文短文,求出现的单词的个数,不区分大小写。8、输入一个正整数,判断是否是回文质数(回文数+质数)。9、了解栈概念,自己编写一个类实现栈的基本功能(入栈,出栈,求栈的

2022-10-23 21:51:45 1039

原创 常见的排序方法

冒泡排序法选择排序法插入排序法 二分排序法 快速排序法(仅用于C++)

2022-10-23 16:38:08 511 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除