SGLang 源码学习路线
SGLang 源码学习路线图(AI Infra 视角)整体架构概览SGLang Runtime(SRT)是一个多进程 serving 架构,核心数据流如下: 123456789101112131415161718192021222324252627282930313233343536373839404142用户请求 (HTTP/gRPC/Python API) │ ▼┌──────────────────────────────────────────────────┐│ HTTP Server (FastAPI) │ entrypoints/http_server.py└────────────────────┬─────────────────────────────┘ │ ▼┌──────────────────────────────────────────────────┐│ ...
C++ STL八股文
Vectorvector的底层实现⭐C++ 标准库中的 std::vector 是一个动态数组,底层通过连续内存块实现,支持快速随机访问和动态扩容。其核心实现细节如下: 1. 底层数据结构vector 内部维护三个指针(或等效的成员变量)来管理内存: _start:指向数组的第一个元素(begin())。 _finish:指向最后一个元素的下一个位置(end())。 _end_of_storage:指向内存块的末尾(表示当前分配的容量上限)。 12345678template <class T>class vector {private: T* _start; // 指向第一个元素 T* _finish; // 指向最后一个元素的下一个位置 T* _end_of_storage; // 指向内存块的末尾 // ...}; 2. 内存分配与扩容初始化 默认构造时,vector 为空,三个指针均为 nullptr。 添加元素时,若当前容量不足,触发动态扩容。 扩容机制 当...
C++面试八股文--参考C++ Primer目录
第 1 章 C++ 基础主要内容:基本类型、字符串、向量和数组、表达式、语句、函数(缺省函数、函数重载、内联函数)、引用。 结构体的对齐规则结构体的对齐规则。 一、结构体对齐规则首先要看有没有用#pragma pack宏声明,这个宏可以改变对齐规则。在没有#pragma pack这个宏的声明下,遵循下面三个原则:1、第一个成员的首地址为0。2、每个成员的首地址是自身大小的整数倍。3、结构体的总大小,为最大成员的整数倍。二、当用 #pragma pack(n)指定时,以 n和最大成员...
C++ STL常用函数——leetcode刷题
STL常用容器容器分类 顺序(序列式)容器: vector:采用线性连续空间,类似于数组; deque:双向开口的连续线性空间,随机存取,双端队列; list:双向循环链表; slist:单向链表; array:固定数组,vector的底层即为 array数组。 关联式容器: set(集合)和 map(映射):都是以红黑树作为底层结构。set不可重复,mutliset可重复;map不可重复,mutlimap可重复; hash_set(unordered_set)和 hash_map(unordered_map):是基于哈希表实现的,查询时间复杂度为O(1)。 容器适配器: stack:以 deque为底部结构并封闭其头端开口形成的; queue:单端队列,由 deque实现; pirority_queue:优先队列,类似于堆,基于 vector容器实现的。 1. string 查找和替换 123int find(const string& str, int pos = 0) const;...
常用设计模式讲解
单例设计模式 ⭐定义单例模式是一种创建型设计模式,它的核心思想是保证一个类只有一个实例,并提供一个全局访问点来访问这个实例。 优点1.全局控制:保证只有一个实例,这样就可以严格的控制客户怎样访问它以及何时访问它,简单的说就是对唯一实例的受控访问。2. 节省资源:也正是因为只有一个实例存在,就避免多次创建了相同的对象,从而节省了系统资源,而且多个模块还可以通过单例实例共享数据。3. 懒加载:单例模式可以实现懒加载,只有在需要时才进行实例化,这无疑会提高程序的性能。 基本要求(规则) 私有的构造函数:防止外部代码直接创建类的实例。 私有的静态实例变量:保存该类的唯一实例。 公有的静态方法:通过公有的静态方法来获取类的实例。 种类饿汉模式不管是否需要使用这个实例,直接先创建好实例,然后当需要使用的时候,直接调方法就可以使用了。 1234567891011121314151617class Singleton{private: // 静态成员变量在类加载时初始化 static Singleton instance;private: Singleton() =...
常见手撕算子——一维数组的softmax
SoftMax Softmax 的 CPU 和 CUDA 写法均是高频考察。面试时有可能会让任选一种写法进行书写,此时自己可以先写 CPU(C++、Python) 版本,然后再写 CUDA 版本。 Softmax公式如下: $$softmax(x_i) = \frac{e^{x_i}}{\sum_j e^{x_j}}$$ 一般为了避免溢出,需要减去最大值,所以通常采用下面这个公式: $$softmax(x_i) = \frac{e^{x_i - max(x)}}{\sum_j e^{x_j - max(x)}}$$ 1. CPU(C++、Python) 版本1234567891011void softmax(float* input, float* output, int N){ float max_value = *std::max_element(input, input + N); float sum = 0; for(int i = 0; i < N; i++){ output[i] =...
常见手撕算子-elementwise
elementwise elementwise 是最简单的一类算子,其指的是对数据进行逐元素操作,例如将两个等长的数组对应元素相加(add)。另外在深度学习中,激活函数会对输入数据的每个元素求对应激活值,故激活函数也算在 elementwise 范围内。 add1234567891011121314151617181920212223242526272829303132333435363738394041// 1. 向上取整#define CEIL(a, b) ((a + b - 1) / (b))// 2. FLOAT4,用于向量化访存,以下两种都可以// c写法#define FLOAT4(value) *(float4*)(&(value))// c++写法#define FLOAT4(value) (reinterpret_cast<float4*>(&(value))[0])//naive版int block_size = 1024;int grid_size = CEIL(N,...
常见手撕算子-reduce
Reduce 算子是指通过对数组中的每个元素进行操作,得到一个输出值的过程。常见的操作包括求和(sum)、取最大值(max)、取最小值(min)等。在 CUDA 中,优化 Reduce 算子可以显著提高计算效率。 1. naive实现1234567//累加__global__ void reduce_v0(float* d_in, float* d_out, int N) { int idx = blockIdx.x * blockDim.x + threadIdx.x; if (idx < N) { atomicAdd(d_out, d_in[idx]); }} 2. 使用warp级并行进行数组归约12345678910111213141516171819202122232425262728293031323334353637383940414243444546#include <cuda_runtime.h>#include...
常见手撕算子——sgemm(单精度矩阵乘法)
1. cpu: 矩阵乘法1234567891011121314151617181920212223242526272829// 二维矩阵void matrixMultiply(const float** A, const float** B, float** C, int m, int p, int n) { // A is m x p, B is p x n, C is m x n for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { float sum = 0.0; for (int k = 0; k < p; ++k) { sum += A[i][k] * B[k][j]; } C[i][j] = sum; } }}// 二维矩阵展开成一维void...
常见手撕算子——transformer的softmax_matrix
1.cpu: 计算每行的softmax12345678910111213141516void softmax_row(float* input, float* output, int M, int N) { for (int row = 0; row < M; row++) { // 第row行 float* input_tmp = input + row * N; float* output_tmp = output + row * N; float max_val = *(std::max_element(input_tmp, input_tmp + N)); // 计算输入数组的最大值 float sum = 0; for (int i = 0; i < N; i++) { output_tmp[i] = std::exp(input_tmp[i] - max_val); //...








