knswd
码龄5年
关注
提问 私信
  • 博客:38,038
    38,038
    总访问量
  • 31
    原创
  • 338,092
    排名
  • 15
    粉丝
  • 0
    铁粉
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:江苏省
  • 加入CSDN时间: 2019-10-18
博客简介:

knswd的博客

查看详细资料
个人成就
  • 获得38次点赞
  • 内容获得20次评论
  • 获得114次收藏
  • 代码片获得438次分享
创作历程
  • 7篇
    2021年
  • 25篇
    2020年
成就勋章
TA的专栏
  • 数据结构
    4篇
  • 面试题
    1篇
  • cuda随笔
    1篇
  • pytorch源码浅析
    1篇
  • cuda权威编程指南
    1篇
  • Eigen
    3篇
  • pytorch
    1篇
  • 深度学习
  • 内存管理
  • 状态压缩dp
    1篇
  • pat
    3篇
  • dp之数位dp
    1篇
  • QT
    1篇
  • 笔记
    1篇
创作活动更多

如何做好一份技术文档?

无论你是技术大神还是初涉此领域的新手,都欢迎分享你的宝贵经验、独到见解与创新方法,为技术传播之路点亮明灯!

178人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

Pytorch 源码浅析1.Topk(上)

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

cuda随笔1.基数排序

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

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

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

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

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

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 ·
7462 阅读 ·
5 点赞 ·
2 评论 ·
21 收藏

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

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

Eigen3.3.9安装

下载https://gitlab.com/libeigen/eigen/-/releases/3.3.9tar -xvf 解压解压后进入文件夹
原创
发布博客 2021.01.22 ·
3048 阅读 ·
2 点赞 ·
0 评论 ·
12 收藏

旅行商问题

状态压缩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 ·
593 阅读 ·
1 点赞 ·
0 评论 ·
1 收藏

C++内存管理入门

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

力扣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 ·
240 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

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 ·
133 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

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

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

QTQTableWidget转xlsx

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

二叉树非递归后序遍历

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

QTcreator自适应页面布局

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

Complete Binary Search Tree

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

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 ·
198 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

哈夫曼树(最小堆实现)

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

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

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

pat甲级1029 Median(log(n))

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