博客系统升级
博客系统升级挑战与问题:当前博客拓展性太差,许多功能没有实现审美疲劳,有些单调
目标:寻找一套拓展性解决方案,支持未来的功能拓展:新框架or hexo主题再探索解决当前想实现的功能
用户访问记录追踪
完善about、归档等界面
实现RSS
更换主题,提高文章中代码可读性等
博文自动发布(配合obsidian)
实现
修改主题为butterfly,默认支持特性多,可拓展
通过cloudfare进行用户访问记录分析
添加了about,tag、categories、link、about等页面,内容有待完善
RSS实现
代码可读性且复制性提高
自动发布流程: 创建文章自动创建front matter publish属性为true就复制文件到博客目录下 运行脚本部署推送
使用obsidian的linter插件来创建front matterfront matter格式
123456789---title:date:updated:tags:categories:coverpublished---
关于监听published属性要么外部脚本监听,要么obsidian内监听 ...
effective modern c++
条款一:类型推导1.参数类型是指针或引用,但不是万能引用
忽略掉指针和引用符号,对类型进行对应,如果形参无const,根据实参有没有const决定推导类型有没有const,如果形参有const,无论实参有没有const推导类型都有const
2.参数类型是万能引用
万能引用即右值引用T&&,如果实参是左值,则被推导成左值引用,注意即使实参不是引用也会被推到成左值引用,如果是右值,则为右值,是不是引用取决于实参。 保留const
3.参数类型既不是指针也不是引用
按值传递,直接推导类型,忽略const和volatile和引用。
数组的推导:由于数组和指针的混淆性,若不加引用号的话,数组会被推导成指针,若加了引用号,则会被推导成数组,并且可以获取数组大小,利用这一特性可以在编译期获取数组大小。
条款二:autoauto的类型推导和函数参数的类型推导同理
但是当auto声明的变量是大括号括起时,推导类型属于initializer_list<T>,特别注意只有auto能推导出大括号括起的初始化表达式,这也是auto和参数推导的唯一区别。
c++14支持auto推导 ...
性能优化技巧总结
0.前言本文是我的性能优化经验的一点总结,主要是通过各种优化竞赛积累下的经验,有些方法也适用于工程中。写这篇文章本意是作为自己的备忘录,如果能够给初学者朋友们一点帮助那就更好了。
本文应该会持续更新,我会把学到的优化方法和技巧都记录下来。
1.使用工具分析程序,找到热点优化的前提是抓住重点,找到程序热点。
工欲善其事,必先利其器
vtune:intel平台的话vtune已经十分好用了
gperftools:谷歌的性能优化工具集
perf:linux内核性能分析工具
nsight compute\system:cuda性能分析
返璞归真,手动插桩
2.预处理(减少重复计算)首先应当仔细阅读代码,理清代码结构,尽可能的通过预处理等手段减少不必要的计算,比如将循环中多次计算提前一次性算出等。这一步是很有必要的,因为大多数情况下程序的baseline都有许多重复计算,同时这一步也是后续优化的基础。
3.优化算法,降低时间复杂度优化计算密集型程序最有效的方法就是降低时间复杂度了,当然这一步是相当困难的,但有些算法或者算法的某个部分是可以降低时间复杂度的。针对算法的优化虽然困难,但是成效通 ...
Cmake
cmake步骤
编写源代码
编写CMakeList.txt
cmake [`CMakeList.txt`所在的目录]
12345 这将生成makefile4. ```makefile make [makefile所在的目录]
编译完成
cmake关键字PROJECT关键字可以用来指定工程的名字和支持的语言,默认支持所有语言
PROJECT (HELLO) 指定了工程的名字,并且支持所有语言—建议
PROJECT (HELLO CXX) 指定了工程的名字,并且支持语言是C++
PROJECT (HELLO C CXX) 指定了工程的名字,并且支持语言是C和C++
该指定隐式定义了两个CMAKE的变量
_BINARY_DIR,本例中是 HELLO_BINARY_DIR
_SOURCE_DIR,本例中是 HELLO_SOURCE_DIR
MESSAGE关键字就可以直接使用者两个变量,当前都指向当前的工作目录,后面会讲外部编译
问题:如果改了工程名,这两个变量名也会改变
解决:又定义两个预定义变量:PROJECT_BINARY_DIR和PROJECT ...
open mlsys
编程接口编程接口:python等脚本语言作为上层接口,c/c++等底层语言来保证性能。
机器学习工作流
数据处理
模型定义:定义神经网络结构
定义损失函数和优化器
训练及保存模型
测试和验证
神经网络层
全连接(Full Connected,FC):当前层每个节点都和上一层节点一一连接,本质上是特征空间的线性变换。
卷积(Convolution):
先定义一个卷积核,通常是N*M的张量,NM通常是奇数,以便让卷积核有一个中心点,
将卷积核对准特征图的某个位置计算卷积。
卷积操作是将卷积核中的值与输入图像或特征图中的对应位置的像素值相乘并将所有成绩相加得到一个单一的值,这个值就是卷积核在当前位置的输出值
将卷积核在输入图像或特征图上沿x和y轴滑动,直到覆盖完整个输入图像或特征图。每次滑动都会计算出一个卷积核的输出值,最终得到一个新的输出图像或特征图。
在卷积神经网络中,通常会将多个卷积核组合在一起使用,以提取不同的特征。这些卷积核可以并行进行卷积操作,产生多个特征图,然后将这些特征图合并在一起,以进一步提高模型的表达能力。
池化(Pooling):
常见的降维操 ...
Kokkos编程指南
KOKKOS编程指南1.简介相比于其他并行编程模型的特点:可移植性
2.machine model为了实现跨架构的可移植性,并保证性能,kokkos有两个重要组件
内存空间:可以在其中分配数据结构
执行空间:使用一个或多个内存空间的暑假执行并行操作
kokkos抽象机器模型
执行空间执行空间用来描述一组并行执行资源,不同的执行空间可以队形不同的计算资源,例如多核CPU、GPU、加速器。Kokkos 模型抽象了为不同执行空间编译代码和将内核调度到实例的方法。这使得应用程序程序员无需使用特定于硬件的语言编写算法。
内存空间计算节点中多种类型的内存由kokkos通过内存空间抽象。
内存空间的实例为程序员提供了一种请求数据存储分配的具体方法,可以用多个内存空间对应不同种类的内存。
原子访问:对于race conditions,可以使用锁, critical regions, 原子操作来避免。
kokkos中的内存一致性问题:kokkos中 内存一致性极弱,程序员应当显示编程保证内存操作的顺序正确,kokkos提供了fence来达到这一点。
3.编程模型kokkos编程模型6个核心抽象:执 ...
Rocm
ROCm——open software platform for accelerated computing
拥有完善的库、工具和管理API
拥有开源的OpenMP和HIP编译器
规模从工作站到云到百万兆级计算
完善的生态系统
HIP:c++运行时api,支持AMD和nvidaGPU
AMD硬件架构GCN 硬件概述AMD GPU由一个或多个着色器引擎(SE)以及一个命令处理器组成,着色器引擎内又有负载管理器和计算单元(CU)。
命令处理器从命令队列中读取命令,提交给工作负载管理器,然后工作负载管理器将任务分配给计算单元。
以下部分AMD设备的SE、CUs/SE数量
workgroup–block
workitem–thread
wavefont–warp
amd硬件允许每个workgroup最多有16个wavefont
将硬件和抽象对应起来,AMD GPU的调度方式如下:
命令处理器从命令队列中获取kernel,创建workgroup,然后将其分发到SE,SE上的工作负载管理器为workgroup创建wavefont,并将其发送到CU。与cuda相同,一个workg ...
cuda c权威编程指南笔记
cuda c权威编程指南笔记一、基于CUDA的异构并行计算1.1并行计算并行性:包括任务并行和数据并行。
当多任务或函数可以独立的大规模的并行执行时,就是任务并行,任务并行的重点在于利用多核系统对数据进行分配。
当同时处理许多数据时,就是数据并行,数据并行的重点在于数据的分配。
CUDA编程非常适合解决数据并行计算的问题
数据划分方法:块划分和周期划分
块划分:每个线程计算一部分数据,通常这些数据有相同的大小
周期划分,每个线程计算数据的多部分
二、CUDA编程模型关于cudaMalloc()参数的解释
12int *da;cudaMalloc((void**)&da,size);
这里da是int指针,在cudaMalloc()的参数中需要一个指向指针的指针(即void**),来将这个指针的值改变为GPU中的内存地址。如果直接传这个指针,只能改变这个指针指向地址的值而不能改变该指针的指向地址(值传递,实际上形参只复制了指针指向的地址)。
关于cudaMemcpy()的同步问题:
a)同一个stream(包括默认stream)中的kernel后面的copy函数总是会等到ke ...
【live house】2023.3.15 脆莓 《重返舞台》
第二次爱上脆莓,整张专辑都可以循环一整天
PAC22-初赛
0.赛题分析
初始化和验证正确性用了一秒,核心函数用了63.5秒
通过分析,该程序为访存密集型,在GPU上可能访存成为瓶颈。
可能存在的优化方法:
编译器优化:感觉无计可施,只替换为dpcpp不变代码的话会变慢
拆分复数类,自己实现,将AOS转换为SOA
修改循环或者进行矩阵转置
GPU版本
多GPU并行
更换buffer为USM
使用MPI多进程来提高GPU利用率
负载均衡
CPUGPU协同计算
降低时间复杂度
1.重写复数库思路:将AOS换位SOA
将复数数据其完全拆分成double数组操作,除了将将AOS换位SOA,还简化了部分中间计算。
问题:拆分复数后显著变慢。
tips:某个方向的优化遇到瓶颈最好不要死钻牛角尖,心态会很受影响,最好换个方向进行优化
原因:因为没有先改变循环的顺序,导致有些数组还是列访问,当将复数数组拆分成两个数组后,cache miss会加倍,cache冲突率也会加倍,所以时间会变慢,在修改循环顺序后保证了所有的数组都是行访问,性能就不会下降了。但是由于在拆分前已经向量化了(vtune显示向量化100%),所以拆分后没有显著的性能提升。等放到GPU上试 ...