自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Pytorch 源码浅析1.Topk(上)

简介本章节将介绍笔者学习pytorch源码中遇到的一些并行算法(基于pytorch)。当然这些源码都可以在官方的github上获取。入口整体思路入口为gather_topk函数,首先会经过RadixSelect函数找到第K大小的数(可能不是唯一的)。然后再并行找到大于这个值的所有数并按序前插以确定Index(本节举例最大Topk)。首先需要了解的前提知识为基数排序,在Pytorch中topk是基于基数排序的变体实现的,了解其原理有助于了解topk的实现。基数排序RadixSelect说这个函

2021-04-07 00:28:55 1170 2

原创 cuda随笔1.基数排序

闲聊其实笔者会写下这篇文章来源与一个问题:TOPK。在写cpu端的串行代码时,往往会用k个大小的堆来解决这类问题(时间复杂度nlog(k)),当k较大时(k >> n)一般会采用快排解决(相对内存跨度太大的堆来说会有更好的cache命中率)应该会有很多这方面的优质讲解资源,这里简单提一下,如有错误,多谢指出。当然上面聊的只是为了勾起你的回忆(如果有的话)。写下来介绍一下并行计算中解决topk的方式。浏览很多深度学习框架会发现topk问题在并行计算中常用基数排序来解决,当然是因为它具有良好

2021-03-17 22:49:00 1379

原创 Cuda C编程权威指南1.并行规约分化+循环展开

简介本章节为本人在学习cuda权威编程指南时的一些笔记,大部分代码和权威指南中的示例类似。这里简单谈一下cuda执行模型,首先每个核函数的启动都对应着一个grid,grid中的所有block共享全局内存,每个block又是由许多线程构成的(block内的线程共享共享内存)。但是CUDA中SIMD的基本单位是一个warp(线程束一般是由32个线程组成,共享寄存器)。cuda编程的核心就是保证同时有更多的线程运行,更高的内存利用率。一般上面两个指标会有所取舍。分化:问题:权威指南中的求和问题。最开始的

2021-03-09 18:23:42 756 3

原创 如何让Eigen代码跑在GPU/线程池上2

GPU篇前提上次讲过了如何让写的eigen代码跑在线程池上,这次讲讲跑在gpu上的版本。当然我们讨论的类都为/unsupported/Eigen/CXX11/ 中定义的类。也是tensorflow许多算子gpu版本实现的依赖。看源码老样子看一下gpustream和gpudevice的定义首先了解一下StreamInterface这个类,从名字就可以看出来这个类作为基类定义了各种流的接口,主要是为了规范各种stream的行为(通过纯虚函数的形式逼迫子类实现这些stream基本行为,比如内存管理)。

2021-03-01 17:21:11 2105 2

原创 Pytorch保存模型

前提模型训练好后自然想要将里面所有层涉及的权重保存下来,这样子我们的模型就能部署在任意有pytorch环境下了。Torch.save/load先介绍一下纯py接口的保存方式。class my_model(nn.Modules): def __init__(self): super(my_module,self).__init__(): self.relu = nn.Relu() def forward(x, self): return self.relu(x) ......

2021-01-23 15:27:31 6965 2

原创 如何让Eigen代码跑在GPU/线程池上1

前提虽说Eigen是一个优秀的并行计算库,但是只跑在单线程环境下在牛鼻和你我写出来的代码也没啥区别。本文需要读者了解GPU并行计算的基础。先看会源码大伙先来看源码:有句话说的好,源码之前了无秘密/usr/local/include/unsupported/Eigen/CXX11这个文件夹下的头文件将满足你的所有需求(嘿嘿,起飞咯)先看一下Tensor头文件:#ifdef EIGEN_USE_THREADS#include "ThreadPool"#endif#ifdef EIGEN_

2021-01-23 00:28:57 4608 4

原创 Eigen3.3.9安装

下载https://gitlab.com/libeigen/eigen/-/releases/3.3.9tar -xvf 解压解压后进入文件夹

2021-01-22 22:33:24 2789

原创 旅行商问题

状态压缩dp的典范之一。今天来学习一下。一般问题都会这样子问:从某个点出发,经过所有点(可能是部分点)后回到原点所需最小距离。暴力时间复杂度为阶乘显然不过关,使用状态压缩dp能达到2^n,一般点的个数为20个以内。首先复习一下集合的操作:1.全集M的子集:for i in range(M - 1)2.某个子集A的补集:(M - 1)^ A3.lowbit(最第非0位) X&(-X)4. 遍历某个集合s的所有子集:for (int i = s;i > 0;i = s&(

2020-10-10 21:34:58 529

原创 C++内存管理入门

C++内存管理学习:内存池。1.为什么要内存池:每malloc一次不仅需要调用brk/mmap系统调用函数,还会产生上下两个用来标识一块被使用的内存的cookie。如果申请的内存只有8字节膨胀率将会达到百分之100。若分配100万次内存就会有800万字节的cookie。内存池的作用就是减少malloc的开销、减少浪费的cookie(宗旨就是快、省)。2.内存池原理:简介内存池:顾名思义就是用户自己管理一大块内存池,每次使用前先看池中是否有空余,有的话直接拿出,没有的话才使用operator n

2020-10-04 17:15:28 189 1

原创 力扣1504. 统计全 1 子矩形

题目描述: 给你一个只包含 0 和 1 的 rows * columns 矩阵 mat ,请你返回有多少个 子矩形 的元素全部都是 1。 示例 1:输入:mat = [[1,0,1], [1,1,0], [1,1,0]] 输出:13 解释: 有 6 个 1x1 的矩形。 有 2 个 1x2 的矩形。 有 3 个 2x1 的矩形。 有 1 个 2x2 的矩形。 有 1 个 3x1 的矩形。 矩形数目总共 = 6 + 2 + 3 + 1

2020-07-07 17:10:40 219

原创 1038 Recover the Smallest Number (30分)

从结果来看,某个字符串a前面所有的字符串b都满足b+a < a+b,否则就应该将它们交换位置,同理a后面所有的b应满足 a +b < b+a…反之若满足这个前提就没有任何字符串能替代当前字符串的位置了所以为充分必要条件.只需在sort的cmp函数中交待这个逻辑就OK#include<iostream>#include<algorithm>#include<string.h>#include<vector>using namespace .

2020-05-27 23:50:59 116

原创 数位dp,找到所有最好字符串

dp实际上就是填表的过程(后面的数据依赖前面的数据)数位dp也是如此,它的本质就是dfs,只不过在深度遍历的时候记录每种情况的数值,下次遇到这种情况时可以直接使用该种情况记录过的值,从而省去了重复的递归达到优化的过程。这里介绍两种例题:1.462,就是给定一个上界n和一个下界m要我们求出不含4,且没有连续的62的数的个数。这里情况的定义为:该位为6和不为6这两种情况(只能在不为上界/下届时...

2020-04-12 23:21:22 217 1

原创 QTQTableWidget转xlsx

QXlsx作为QT的表格控件,还是很好用的。但是这个Qxlsx博客上关于它的内容很少,而且质量也参差不齐。。。楼主在踩完各种坑后自己也总结一下。QTableWidget有许多好用的方法可以直接使用:(记得前面加上ui->控件名,这里只列出了方法)setStyleSheet(“QTableWidget::item{border:1px solid ;}”);//线条加粗setTextA...

2020-03-27 23:19:23 375

原创 二叉树非递归后序遍历

解题:根据二叉树的特性可以知道后序遍历与先序遍历是有一定联系的。后序遍历是每次访问左子树再访问右子树最后打印根节点。如果将先序遍历的左右访问顺序颠倒,即根右左的访问顺序。显然这种情况的结果就是后序遍历的倒序。和先序非递归类似。若节点非空,压入栈中,节点指向它的右子树。空的话判断栈内是否还有元素,有的话判断它的左子树是否非空,空的话直接退栈。非空节点指向它的左子树再退栈。代码:为了省事建树...

2020-03-21 01:14:52 1077

原创 QTcreator自适应页面布局

##第一章使用QT制作一个简单的页面。一定要注意的地方:1.mainwindow一定要布局,不然页面无法自适应大小。未布局mainwindow:会有这个禁止符号,在空白的地方右键布局(根据需要选择)这样就能让布局铺满mainwindow实现整个窗口的布局,即自适应布局。一般的布局方式就两种,一种水平,一种垂直,就是字面意思。把我们的元件按照想要的顺序位置排布。这个很简单。神器:弹簧...

2020-03-20 21:30:59 1144

原创 Complete Binary Search Tree

题目大意:给定一组数据要求我们用这些数据构建一个具有完全二叉树性质的二叉搜索树,并将这个树按层次遍历打印。先建一个节点个数为N的完全二叉树,然后中序遍历这棵树并赋值。二叉搜索树特性:中序遍历为这组数据从小到大升序。所以我们在中序遍历这棵完全二叉树的时候按访问先后为这些节点从小到大赋值,这个树就能具有二叉搜索树的性质了。代码:#include<iostream>#includ...

2020-03-08 22:46:52 169

原创 1068 Find More Coins

题目大意:有N枚硬币,要支付M元钱,如何支付,如果有不同的支付方式,取最小的。此处最小定义为如果第一枚小的为最小,如果第一枚一样,比第二枚…以此类推这道题很想01背包问题,01背包要求的是总价值,而此题是要求组成M的硬币序列。动态转移方程:f(i,j) =max(f(i-1,j),f(i-1,j-coins[i])+coins[i])i:第i枚硬币,f(i,j):加入i枚硬币的最大面值(&...

2020-03-08 00:00:49 171

原创 哈夫曼树(最小堆实现)

哈夫曼树:根据节点的查找频率构建更有效的搜索树如何构造哈夫曼树:每次从堆中拿出两个权值最小的节点组成新的节点,并放入堆中。重复直到堆中只剩一个元素。难点在于要保存每次合并后的新节点的地址(在哈夫曼树中的地址)代码://用最小堆来实现哈夫曼树的建立//哈夫曼树简介:根据结点的额不同查找频率构造的更有效的搜索树#include<iostream>#include<st...

2020-03-06 17:48:57 1262

原创 堆的插入,删除,创建C语言实现

温故而知新。。。昨天刚学了堆的网课,今天就迫不及待地要自己用代码实现了(有人可能会问为什么不昨天实现呢,这肯定不是因为懒,增加一下难度)。堆地简介:结构上是数组形式地完全二叉树(特性:第i个节点的左子树为i2右子树为i2+1)顺序上:任一父节点大于左右节点(最大堆),堆也可以解释为优先队列,比如操作系统的进程调度里就有其应用(一般情况下优先级最高的最先执行)。。。//堆(优先队列,用来处理具...

2020-03-01 15:21:39 1153 1

原创 pat甲级1029 Median(log(n))

我被这道题卡了两天,倒不是不知道要用logn的算法,而是pat的意思是当n+m为偶数时取分割线左边的那个数为中位数,而不是取平均值。。。心态炸裂,以后只要它没提我就不取平均了。艹一开始我想到的方法就是合并排序,可惜内存和时间都超了。而且这道题的两个数组本身就是增序排好的,显然就算用sort都是比较坏的情况了,nlogn的时间都达不到。我想到的第二种方法就是插入,先将a集合里的数放入数组,然后找...

2020-02-29 22:56:53 186

原创 二叉搜索树的创建(插入)、查找、删除、遍历(中序非递归)

最近在学数据结构,前段时间学了二叉搜索树和平衡二叉树,但当时眼高手低就看了网课啥也没敲。。现在优点愧疚,就补上了。二叉搜索树:使用二分查找的思路构树(平衡二叉树完全就是,不过二叉搜索树有些遗憾)。特点:任一节点的权值都大于其左右子树上所有点的权值。平衡二叉树:简介:也是搜索树,不过它改进了:二叉搜索树由于插入顺序的不同,最坏查找次数也不同,运气不好就是O(n).官方解释:任一节点的平衡...

2020-02-29 17:17:38 437

原创 python实现汉字点阵显示

def fun(name):gbk = name.encode('GBK')print(gbk)L =list(gbk)offset = 94*(L[0]-0xa0 -1) + L[1]-0xa0-1offset = offset*32print('offset is :%d' % offset)f=open('HZK16','rb')f.seek(offset)display=...

2020-02-27 20:33:54 3602 1

原创 python 实现文件编码方式的转换

首先在linux下有iconv命令可以实现编码字符集的转换具体使用方式:iconv -f codename -t codename filename > newfilename-f 后跟源编码,-t后跟转换后的编码。可以使用iconv -l列出操作系统支持的编码方式接下来使用python来实现,python内置函数encode('codename1'):编码,将字符的codenam...

2020-02-27 20:21:54 931

转载 编码字符集与中文文本处理

不知道大家都开始上网课了没,反正我是上了。这不,这两天一脸懵逼的学了编码字符集,上来写点东西巩固一下知识,要是有大佬能指点一下是再好不过了。。。我就不介绍历史啥的了,就写一下自己这两天学到的东西吧。浅谈一下自己对编码方式的了解。unicode规定了几乎所有文字的一个字符集,并给每个字符一个唯一的编码,每个字符对应一个唯一的4字节编码。4字节2^32大概能包含40多亿个字符吧,是足够的了。其中...

2020-02-26 21:54:26 207

原创 PAT甲级1024 Palindromic Number

虽然看不懂这个英文但也能知道这是回文数了,哈哈。题目意思就是给一个数需要多少步可以成为回文数(每步操作为原数与其回文数相加)。我是先判断再加的,这样本生是回文数和第K步成为回文数也不会被忽略了。刚学的vector直接拿来用了,舒服。再次感叹c++的STL真的是太好用了,不需要像C一样还要自己组织数据。。。...

2020-02-22 16:54:01 141

原创 PATJ1023

这道题挺简单的,不过也挺好玩的直接上代码吧,留念一下,给以后留个笑点。空出第一位留给进位。。。还有如果有进位是原来的数先乘以兔再加一。。一开始我的神操作笑死我自己了。#include#include<stdio.h>#includeusing namespace std;int main() {int i = 0;int a[21] = {0};int b[11] =...

2020-02-21 20:42:52 167

原创 PATJ1022

##PATJ1022题目大意:有一个数字图书系统,记录输入图书的信息(ID,名字,作者(唯一),关键字,出版社,年份)给m个请求要求我们找出符合条件书的ID题目不难,我来说说自己遇到的麻烦。1:输出的ID必须为7位,不足要在前补02:feges的麻烦,由于我使用的是C,getline用起来有点麻烦,所以我索性用了fgetsfgets(char ,size_t size,FILE stre...

2020-02-21 20:16:15 192 1

原创 PAT甲级1018(disjktra+深度遍历)

这道题着实有点坑,不过收获也不少。很容易想到用disjktra算法来获取最短子路径,这里稍微解释一下这个算法。disjktra算法基于广度优先遍历,从中心点向外一层一层寻找其他地点(每一层的依据为到原地的最短距离),但它优于广度算法就在于它有一个标志位记录了是否展开过此点(遍历此点能到地所有地方),这样就避免了在条路上来回走,保证不回头减少了时间复杂度。它属于贪心算法,每次都拿出距离原点最近且...

2020-02-19 19:57:12 614

原创 PAT甲级1014

##PATJ1014这是一道30分的题,算是个应用题也就是自由发挥那种类型的题。如果是在考场遇到这题的话全靠运气(狗头),其实题不难,就是题目介绍里有坑(甲级模范)题目大意:一个银行8:00开业有N个窗口,窗口和等待区之间有一条黄线,黄线内每个窗口可以容纳M个顾客,顾客每次去人最少的那队排队。给我们顾客数和每个顾客的服务时长,要求我们输出特定顾客离开银行的时间(如果顾客未能在17:00前接受...

2020-02-17 22:51:58 189

原创 PAT甲级1013(图的遍历)

##patj1013大家好,低头中午,抬头又是晚上了。编程的时间总是那么的短暂。由于本人非科班出生(虽然还在上大学,但是也是半路出家)所以数据结构都是自己实战修炼的,今天这道题上榜也是因为出现了我很少接触的图论。。。笔者现学现卖。。上题题目大意:说的是有N个城市,M条道路,K个需要关注的路。当发生战争时如果敌人占领了某一地那么那座城市既不能出也不能进,为了不影响其他城市间的互通我们需要为此...

2020-02-17 22:50:14 339 2

原创 PAT甲级1012

##PATJ1012原本是不想为这道题写个博客的,但是。。。笔者为这道题写的程序不太美观,中途题目的意思也没读懂就贸然下手导致笑话层出不穷。老样子先看题吧题目大意:输入:给出N个需要确认排名的学生C语言、数学、和英语的成绩,M个带确认排名的学生。排名优先级:平均成绩 > C > math > english输出:依次输出M个学生的最好成绩排名和最好成绩科目,如果最好...

2020-02-17 22:48:12 154

原创 PAT甲级1010TMD的坑

##TMLGB一切皆有可能内容:简介:故事要从博主今天中午睡了个午觉说起,博主醒了浑身乏力只能祭出一道PAT题来找回精神,从此踏上一条不归路。。。废话不多说,祭题。题目大概意思:N1,N2为输入的两个非负整数redix为第tag数的进制数,让我们求最小的redix2使得N1 = N2,比如例子6 110 1 10的答案为2:十进制下的6等于二进制下的110。先说一下笔者遇到的坑,首先...

2020-02-17 22:45:39 323

空空如也

空空如也

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

TA关注的人

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