- 博客(16)
- 收藏
- 关注
原创 CUDA编程【7】 线程束
的概念,这是CUDA编程中一个非常重要的性能优化点。可以看到有分支的要慢于无分支的代码。对于一个三维组织的线程块,其。
2025-01-06 20:10:00
494
原创 CUDA编程【6】CUDA执行模型概述
GPU 由多个流式多处理器(Streaming Multiprocessors, SM)组成,每个 SM 又包含多个 CUDA 核心(CUDA Cores)和其他硬件资源。GPU中每个SM都能支持数百个线程并发执行,每个GPU通常有多个SM,当一个核函数的网格被启动的时候,多个block会被同时分配给可用的SM上执行。在SM上同一个线程块(Thread Block)内,多个线程同时执行,实现并行计算。在单个线程内,通过流水线技术同时执行多条指令,提高指令执行效率。以下是一个SM的架构图。
2025-01-03 14:41:01
1037
原创 CUDA编程【5】获取GPU设备信息
CUDA 提供了一系列 API 来查询设备的硬件信息、性能特性和限制。可以获取设备的共享内存配置(4 字节或 8 字节 bank 大小)。可以获取设备的详细属性信息,包括硬件特性、计算能力、内存大小等。可以获取设备的资源限制,例如栈大小、堆大小等。可以获取设备的 L1 缓存和共享内存的配置。可以获取系统中可用的 CUDA 设备数量。可以获取当前正在使用的设备 ID。可以查询设备的最大线程块数。可以查询设备的内存时钟频率。可以查询设备的总显存大小。可以设置当前使用的设备。可以查询设备的时钟频率。
2025-01-03 13:28:41
842
原创 CUDA编程【4】组织并行线程
目的:是的不同的线程处理不同的数据,避免不同的线程没有散乱的访问内存,充分利用多线程的优势为了充分利用多线程的优势,我们必须考虑数据在设备内存或者主机内存中的分布以一个6x8的矩阵为例,如果是行优先(大多数c++实现都是行优先)的内存存储方式,他的分布如下图所示。
2025-01-03 11:33:03
885
原创 CUDA编程【2】概述
CUDA C中的函数限定符CUDA C扩展了C语言,引入了一些新的函数限定符,用于指定函数的执行位置和调用方式。限定符执行位置调用方式备注__global__设备端执行可以从主机调用,也可以从计算能力3以上的设备调用必须返回void,用于定义核函数。__device__设备端执行只能从设备端调用,不能被cpu调用用于定义在GPU上执行的辅助函数。__host__主机端执行只能从主机调用与普通C函数一致,可以省略(默认就是__host__特殊情况下:同时定义__device__和。
2025-01-02 20:08:13
1001
原创 【hot100】回溯
文章目录46.全排列回溯算法78. 子集(二进制枚举没写出来)回溯二进制枚举(最优)17. 电话号码的字母组合回溯39. 组合总和回溯22. 括号生成回溯单词搜索回溯 + 剪枝46.全排列回溯算法时间复杂度:O(n⋅n!),其中 n 为 nums 的长度。视频中提到,搜索树中的节点个数低于 3⋅n!。实际上,精确值为 ⌊e⋅n!⌋,其中 e=2.718⋯ 为自然常数。每个非叶节点要花费 O(n) 的时间遍历 onPath 数组,每个叶结点也要花费 O(n) 的时间复制 path 数组,因此时间复杂
2024-12-02 21:21:23
530
原创 【hot100】图
注意当使用路径压缩(见 find 函数)和按秩合并(见数组 rank)实现并查集时,单次操作的时间复杂度为 α(MN),其中 α(x) 为反阿克曼函数,当自变量 x 的值在人类可观测的范围内(宇宙中粒子的数量)时,函数 α(x) 的值不会超过 5,因此也可以看成是常数时间复杂度。题目中是以列表形式给出的先修课程关系,为了对图进行广度优先搜索,我们需要存储成邻接表的形式,空间复杂度为 O(n+m)。在广度优先搜索的过程中,我们需要最多 O(n) 的队列空间(迭代)进行广度优先搜索。
2024-12-02 16:51:20
785
原创 【hot100】二叉树
由于递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,而递归的深度显然为二叉树的高度,并且每次递归调用的函数里又只用了常数个变量,所以所需空间复杂度为 O(Height)。Morris 遍历中每个节点会被访问两次,因此总时间复杂度为 O(2n)=O(n)。空间复杂度取决于栈深度,而栈深度在二叉树为一条链的情况下会达到 O(n) 的级别。时间复杂度:O(N),其中 N 为二叉树的节点数,即遍历一棵二叉树的时间复杂度,每个结点只被访问一次。
2024-11-30 21:46:27
1151
原创 【hot100】链表
时间复杂度:O(nlogk),其中 k 为 lists 的长度,n 为所有链表的节点数之和。每个节点参与链表合并的次数为 O(logk) 次,一共有 n 个节点,所以总的时间复杂度为 O(nlogk)。递归深度为 O(logk),需要用到 O(logk) 的栈空间。时间复杂度:O(n+m),其中 n 为 list 1的长度,m 为 list 2的长度。时间复杂度:O(n+m),其中 n 为 list 1的长度,m 为 list 2的长度。空间复杂度:O(n),其中 n 是链表的长度。空间复杂度:O(1)。
2024-11-29 15:52:28
708
原创 c++ 智能指针
是 C++ 标准库提供的智能指针之一,主要用于管理单个对象的生命周期,确保对象在不再需要时能够自动被删除,从而避免内存泄漏。:删除当前管理的对象(如果有的话),并可选地接管新的对象。:删除当前管理的对象(如果有的话),并可选地接管新的对象。提供了一种有效的方式来管理对象的生命周期,特别是在处理复杂对象图和循环引用的情况下。:返回一个指向删除器对象的引用,如果使用了自定义删除器的话。:接收一个指向动态分配对象的原始指针,接管该对象的所有权。:接收一个指向动态分配对象的原始指针,接管该对象的所有权。
2024-11-28 18:39:11
828
原创 操作系统面经-IO
基本原理就是程序呼叫select,然后整个程序就阻塞状态,这时候,kernel内核就会轮询检查所有select负责的文件描述符fd,当找到其中那个的数据准备好了文件描述符,会返回给select,select通知系统调用,将数据从kernel内核复制到用户空间。select 基于位图实现,每个文件描述符对应一个位(bit),如果该位被设置(即值为1),则表示对应的文件描述符是集合的一部分;那么从工作线程的角度来看,它们就直接获得了数据读写的结果,接下来要做的只是对读写的结果进行逻辑处理。
2024-11-20 21:33:30
677
原创 操作系统面经-进程管理
线程是进程当中的一条执行流程。同一个进程中,线程共享进程的大部分资源,又持有部分每个线程独有的少量独占资源共享资源:内存地址空间、文件描述符、环境变量、进程控制块、信号处理、当前工作目录。独占资源:寄存器、栈、线程本地存储、线程控制块。
2024-11-20 18:52:48
789
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人