无标题
1.ThreadsPerBlock和Blocks的数量受哪些条件约束。 2.理论占用率怎么计算? 3.什么是warp,什么是warp divergence? 4.cuda的内存模型里有多少种memory,它们的位置(片上还是板上),带宽和延迟的相对大小? 5.global memory的访存合并是什么? 6.什么样的变量会被分配在register上?什么样的变量会被分配在local memory上? 7.Block是怎么被SM调度执行的? 8.什么是cuda core? 什么是tensor core? 9.什么是bank confict+?怎么避免bank confict,你能想到多少方法? 10.描述-下Block reduce的大致实现。 11.描述-下double buffer(ping pong buffer)的大概原理和实现。 12.什么是roofline model+?什么是memory bound,什么是computation bound? 13.kernel...
无标题
123456789// 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])
2025年7月面试过程
海康威视 7.2 手撕self-attention 自我介绍 项目 Transformer,attention,qkv,embedding 是否做过only decoder/encoder的工作 Transformer Attention QKV原理 海康威视 ai加速工程师 首先是自我介绍 为什么选择这个岗位 问了一个有关cuda的加速具体一个软件忘了 问了研究生期间最大成就 多线程 对加速未来方向的看法 编程题是给出两个特征图左上角坐标和宽高 计算交并比 最后反问环节 海康威视 cv算法 transformer的注意力怎么做的 找到数组中第k个最大的数 海康威视...
大模型各种算子手撕(实现)
注意力机制的代码实现- 1234567891011121314151617181920212223242526272829import torchimport torch.nn as nnimport torch.nn.functional as Ffrom math import sqrtclass SelfAttention(nn.Module): def __init__(self, input_dim, dim_k, dim_v): super(SelfAttention, self).__init__() self.q = nn.Linear(input_dim, dim_k) self.k = nn.Linear(input_dim, dim_k) self.v = nn.Linear(input_dim, dim_v) self.norm = sqrt(dim_k) def forward(self, x): Q =...
机器学习各种算法手撕(实现)
1. 手撕 k-means 算法 1234567891011121314151617181920212223242526272829303132333435import numpy as npimport matplotlib.pyplot as pltdef kmeans(data, K, max_iterations=100): # 随机初始化K个簇中心点 centers = data[np.random.choice(data.shape[0], K, replace=False)] # 迭代更新中心点 for _ in range(max_iterations): # 计算每个样本到各个中心点的距离 distances = np.linalg.norm(data[:, None] - centers, axis=2) # 等价于distances = np.linalg.norm(X[:, np.newaxis, :] - centers, axis=2) # 分配每个数据点到最近的簇 labels =...
操作系统八股文
第 1 章 操作系统概述 第 2 章 进程管理 线程与进程的区别⭐⭐⭐ 定义 进程是操作系统资源分配的基本单位,是一个独立运行的程序实例。每个进程有独立的内存空间、全局变量和系统资源。 线程是进程中的一个执行单元,是CPU调度的基本单位。多个线程共享同一个进程的内存和资源。 调度。线程是独立调度的基本单位,进程是拥有资源的基本单位。在同一进程中,线程的切换不会引起进程切换。在不同进程中进行线程切换,如从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。 拥有资源。进程都是拥有资源的基本单位,而线程不拥有系统资源,但线程可以访问其所属进程的系统资源。 并发性。在引入线程的操作系统中,不仅进程之间可以并发执行,而且多个线程之间也可以并发执行。 系统开销。进程创建、撤销和切换,所付出的开销远大于线程。 地址空间。进程的地址空间之间互相独立,同一进程的各线程间共享进程的地址空间。 通信方面。进程间需要用PV操作、共享存储、消息传递和管道通信等方式进行通信,而线程间可以直接读/写进程数据段(如全局变量)来进行通信。 进程、线程和协程的区别⭐ 1....
C++ STL八股文
Vector vector的底层实现⭐ 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。 添加元素时,若当前容量不足,触发动态扩容。 扩容机制 当...