常见手撕算子-transpose
naive版本1234567__global__ void transpose_v0(float* input, float* output, int M, int N){ int row = blockIdx.y * blockDim.y + threadIdx.y; int col = blockIdx.x * blockDim.x + threadIdx.x; if(row < M && col < N){ output[col * M + row] = input[row * N + col]; }} 优化版本1:shared memory思路: 先将数据从global memory拷贝到shared memory中 通过shared memory进行转置 通过shared memory将数据拷贝到global memory中 1234567891011121314151617template <int TILE_SIZE>__global__...
C++面试手撕题
使用C++实现一个读写锁实现一个uniqued_ptr1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980#include <utility> // 用于std::movetemplate <typename T>class unique_ptr {private: T* ptr; // 指向管理的对象public: // 构造函数,接受原始指针 explicit unique_ptr(T* p = nullptr) : ptr(p) {} // 析构函数,释放管理的对象 ~unique_ptr() { delete ptr; } // 禁止拷贝构造函数(独占所有权不能被拷贝) ...
计算机网络八股文
第1章 计算机网络体系结构第2章 物理层第3章 数据链路层第4章 网络层NAT 的作用是什么?NAT(Network Address Translation,网络地址转换) 主要用于在不同网络之间转换 IP 地址。它允许将私有 IP 地址(如在局域网中使用的 IP 地址)映射为公有 IP 地址(在互联网中使用的 IP 地址)或者反向映射,从而实现局域网内的多个设备通过单一公有 IP 地址访问互联网。 NAT 不光可以缓解 IPv4...
面试和笔试中经常出现的(模板)代码题
1. 实现LRUCache123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136// 方法一:不使用STL,自己设计数据结构#include<unordered_map>#include<iostream>using namespace std;struct DLinkedNode { int key, value; DLinkedNode* prev; DLinkedNode* next;...
leetcode刷题总结
...
面试智力题大全
1. 有一栋100层高的大楼,给你两个完全相同的玻璃球。假设从某一层开始,丢下玻璃球会摔碎。那么怎么利用手中的两个球,用什么最优策略知道这个临界的层是第几层?核心思路:等差递减间隔法假设最坏情况下最多需要 $ n $ 次尝试,则第一次从第 $ n $ 层丢球: 若碎了:用第二个球从第1层到第 $ n-1 $ 层依次试,最多试 $ n-1 $ 次,总次数 $ n $ 次(含第一次)。 若没碎:第二次从第 $ n + (n-1) $ 层丢球(间隔递减1,确保剩余次数覆盖后续楼层)。以此类推,每次间隔递减1,直到覆盖100层。 数学推导:确定初始间隔 $ n $设首次尝试楼层为 $ n $,后续每次间隔递减1,总覆盖楼层需满足:[n + (n-1) + (n-2) + \dots + 1 \geq 100]左边是等差数列求和,公式为 $ \frac{n(n+1)}{2} \geq 100 $。解得 $ n \approx 13.65 $,向上取整得 $ n = 14 $。 具体策略步骤 第一次从14层丢球: ...
深度学习基础知识总结
数学基础 线性代数 矩阵运算(乘法/逆/特征值分解/SVD) 向量范数(L1/L2/无穷范数)与矩阵范数 梯度向量与Hessian矩阵(二阶优化基础) 微积分 标量/向量/矩阵求导(梯度、雅可比矩阵) 链式法则在反向传播中的应用 凸函数与非凸函数(神经网络优化的非凸性) 概率论与信息论 概率分布(高斯分布、伯努利分布、Dirichlet分布) 最大似然估计(MLE)与贝叶斯估计 信息熵、交叉熵、KL散度(损失函数设计核心) 最优化理论 梯度下降(GD/SGD/Momentum/Adam等变种) 学习率调度策略(warm-up、余弦退火) ...
深度学习进阶
三、深度学习进阶 模型压缩与加速 知识蒸馏(Knowledge Distillation) 剪枝(Pruning)、量化(Quantization) 模型部署(ONNX、TensorRT)
自然语言处理知识点
自然语言处理(NLP) 词嵌入(Word2Vec、GloVe、FastText) 文本分类与序列标注(BiLSTM-CRF) 预训练语言模型微调技巧
分布式训练:DeepSpeed的ZeRO1/2/3
简介DeepSpeed是微软推出的大模型分布式训练的工具,主要实现了ZeRO并行训练算法。 ZeRO(零冗余优化器,Zero Redundancy Optimizer)主要从模型参数(Parameters)、优化器状态(Optimizer States)和梯度(Gradients)三个方面对模型进行拆分,从而降低大模型训练占用的显存。 ZeRO的三个级别ZeRO被分为了三个级别: ZeRO1:对优化器状态进行拆分; ZeRO2:在ZeRO1的基础上,对梯度进行拆分。 ZeRO3:在ZeRO2的基础上,对模型参数进行拆分。 ZeRO1在模型训练中,正向传播和反向传播并不会用到优化器状态,只有在梯度更新的时候才会使用梯度和优化器状态计算新参数。 假设有$N_d$个并行的进程,ZeRO1会将完整优化器的状态等分成$N_d$份并存储在各个进程中。当反向传播完成之后,每个进程的优化器会对自己储存的优化器状态(包括Momentum、Variance 与 FP32 Master Parameters)进行计算与更新。更新过后的Partitioned FP32 Master...










