- 博客(171)
- 收藏
- 关注
原创 《C++ 并发编程实战》一些示例代码段
在线程中可能访问局部变量的引用或者地址,但是在执行过程中该变量会被释放,导致线程运行出错,比如下面的例子因为线程分离了,local_val就有可能被回收。直接的修改方式就是把detach改为join,这样只有等到线程使用完, local_val才会被回收。对于一个线程如果不将它分离(detach),那么就要记得对它调用join。问题是并不是每次都会记得,甚至记得了也不一定能调用成功,比如下面的示例:如果要确保会调用join,需要捕获异常 这样非常麻烦,因为需要对所有可能出现异常的地方都使用
2025-08-05 11:59:07
1079
原创 [Triton笔记7]融合注意力 (Fused Attention)
功能:移动块指针的位置。关键点:必须接收返回值,否则移动无效。优势:配合块指针使用,能够自动处理复杂的边界逻辑和步长计算,让代码更简洁且易于优化。如果你在 H100 (SM90) 或更新的显卡上开发:强烈建议优先使用。它能解锁 TMA 的异步搬运能力,显著降低计算单元的访存压力。如果你需要多维(3D-5D)支持:该函数提供了比以往更规范的 N-Dim 支持。注意点:使用此函数通常需要配合自定义的内存分配器(如示例中的alloc_fn),以确保分配出的地址满足硬件对齐要求。# 形状约束。
2026-06-09 19:29:57
191
原创 C++笔记:偏现代C++日志系统
头文件intLogStream::currentLogStream::currentLogStream::currentLogStream::current源文件definedintintint。
2026-06-07 23:09:35
246
原创 C++笔记:C++20风格线程池
提交任务和取任务都会争抢同一把锁,任务提交非常频繁时,生产者和消费者容易互相阻塞。工作线程不需要每执行一个任务都和提交线程争同一把队列锁,只有读缓冲耗尽时才需要接触写缓冲。:它内置了一个停止状态,允许你安全地请求线程停止,而不是粗暴地杀死线程。:根据任务积压数量自动增加线程,根据空闲时间和低水位线自动回收线程。保护提交和停止之间的临界区,避免线程池停止时仍然有新任务进入队列。:把任务生产者和消费者常用的锁分开,降低高频提交任务时的锁竞争。:工作线程等待任务的最长空闲时间,超时后会判断是否可以退出。
2026-06-06 22:33:13
429
原创 [Triton笔记5]低内存 Dropout
假设我们有一个输入向量x∈Rnx∈Rn。在应用 Dropout 时,我们引入一个随机向量r∈01nr∈01n,其中每个元素rir_iriri∼Bernoulli1−pri∼Bernoulli1−p这里,ppp是失活概率(即置为 0 的概率)。Dropout 的数学本质是通过稀疏化输入来强制模型学习鲁棒特征(防止共同适应,Co-adaptation)。
2026-05-21 21:14:04
377
原创 [Triton笔记3]融合 Softmax (Fused Softmax)
参数对应 C++/编译优化概念目的num_stages掩盖访存延迟 (Hide Latency)减少分支指令开销flatten优化流水线效率硬件资源解耦 (New Architectures)防止寄存器溢出 (Spilling)
2026-05-11 19:21:54
389
原创 C++笔记:Lambda表达式
解决了“动不了”的问题:支持std::move捕获。解决了“写不死”的问题:参数支持auto,实现了一次编写,多类型适用。语法灵活性:捕获列表不再仅仅是“取变量”,而是一个可以进行“赋值操作”的地方。特性C++11C++14C++17C++20参数类型固定类型auto(泛型)保持泛型模板参数列表<T>捕获写法基础值/引用初始化捕获 (可移动)[*this](拷贝对象)显式this捕获要求编译期运行时为主运行时constexprconsteval约束无无无。
2026-05-10 23:11:58
435
原创 [Triton笔记2]自动调优和共享内存
简单来说,允许你跳过 Triton 的高级编译阶段,直接喂给它你写好的中间表示(IR)或汇编代码。通常情况下,Triton 的编译流程是:->Triton IR->->LLVM IR->PTX->如果你设置了,你就是在告诉编译器:“别管我 Python 代码里写了什么,直接拿我这个现成的 IR 文件去跑测试。.ttgir: Triton GPU IR (Triton 自己的中间表示).llir: LLVM IR (通用的底层编译器中间表示).ptx: NVIDIA GPU 汇编代码.amdgcn。
2026-05-07 19:07:20
431
原创 [Triton笔记1]核心概念
你可以把它理解为“带自动 JIT 触发功能的 C++ 模板”。// 它的效果等价于:// 当你在 Python 里调用时:// 相当于:// 1. 检查是否有 kernel<float, 512> 的实例?// 2. 没有则立即调用 nvcc 现场编一个。// 3. 运行它。这种设计让你既能享受 Python 快速迭代的快感(改个参数直接运行),又能获得 C++ 级别的执行效率。(..., )
2026-05-03 19:10:57
472
原创 cuda编程笔记(41)--异步数据拷贝
基于前两节 节的内容,本节将详细指导并演示 GPU 内存层级内的异步数据移动。内容涵盖:用于逐元素拷贝的、用于块状(一维和多维)传输的,以及用于寄存器到分布式共享内存拷贝的;并展示了这些机制如何与和集成。
2026-04-23 15:11:17
454
原创 cuda编程笔记(40)--Pipelines(流水线)
四个操作共同构成了一个闭环的资源流转系统。流水线(Pipeline)是一组有限的“车厢”(Stages),生产者装货,消费者取货并退还车厢。获取/提交(生产者)和等待/释放(消费者)。
2026-04-22 11:39:29
460
原创 cuda编程笔记(39)--Asynchronous Barriers(异步屏障)
本文需要有cooperative_groups的API基础,可以见我以前的文章,虽然讲解的不太好,以后有时间重置一下。可以将理解为的“进化增强版”。传统的是且的,而异步屏障则允许“到达”和“等待”这两个动作。在传统的 CUDA 同步中,调用后,线程必须停下来等待所有线程到齐。线程可以先声明“我到了”(Arrive),然后去执行不依赖同步结果的代码,最后再检查“大家都到了没”(Wait)。在等待数据传输(如异步内存拷贝)的过程中,GPU 可以继续进行计算,从而隐藏延迟。
2026-04-21 23:05:54
468
原创 cuda编程笔记(38)--CUDA 异步回调
在 CUDA 中,大部分操作(如内核启动和)都是的。这意味着 CPU 把任务丢给 GPU 后,会立刻继续执行后面的代码,而不会原地等待 GPU 算完。允许你在 CUDA 流(Stream)的任务队列中插入一个。
2026-04-21 11:48:24
400
原创 C++笔记:std::invoke
会导致模板匹配失败(替换失败),从而产生更干净的编译错误信息,而不是在函数体内部报错。,针对不同的类型,你必须编写不同的调用代码。预测:如果我用某些参数调用某个函数,返回值的类型会是什么。: 是 C++17 提供的模板别名,直接返回类型。,如果调用是不合法的(例如参数不匹配),则不会定义。:它直接告诉读者:“这个函数的返回类型,就是调用。能跑通的代码,这个返回类型推导就绝对不会出错。:如果用户传入了错误的参数(比如参数个数不对),: 拟传递给该对象的参数类型列表。: 可调用对象的类型。
2026-04-16 23:18:54
264
原创 cuda编程笔记(37)--逐行量化的kernel分析
在深度学习中,常见的量化是将float32转换为int8。整个矩阵共用一个 Scale。如果矩阵中某个值特别大(Outlier),会导致其他小值在量化后全部变成 0,精度损失严重。矩阵的每一行 $i$ 都有一个专属的 $s_i$。对于矩阵中的元素,其量化过程为:其中通常定义为该行绝对值的最大值缩放到int8。
2026-03-30 11:39:21
262
原创 Windows版cuda+VSCode+CMake!一文搞定所有配置信息
这篇文章是在Linux环境里配置的,下面解释Windows下 怎么用vscode配置cuda。
2026-03-15 16:51:54
487
原创 如何下载老版Visual Studio
这样Visual Studio Installer就会自动下载对应版本。VS上新后老是把旧版链接藏起来,导致找半天也找不到,那到底该怎么办。会找到相应的版本,然后选一个版本。首先在命令行输入下面的命令。
2026-03-14 20:29:30
418
原创 C++笔记:std::numeric_limits
是 C++ 标准库里一个。通过模板的特化提供此信息。另外,对于每个存在特化的 cv 无限定类型的每个 cv 限定版本存在特化,等同于非限定的特化,例如提供和,且它们等价于。
2026-03-12 22:17:32
344
原创 C++笔记:std::hash
假设我们自定义了一个类Pointint x;int y;// ❌ 编译错误因为std::hash<Point>不存在哈希表必须知道:Point -> hashint x;int y;//相当于自己设计hash算法的可调用对象类int main()//让哈希表用自己的算法。
2026-03-11 21:04:10
287
原创 [CUTLASS笔记1]基础GEMM
CUTLASS的核心优势是方便我们在写算子融合的时候,不用每次都精确手敲cuda,它帮我们做了一定的封装,下面先入门CUTLASS版的GEMM。我们的矩阵计算的模板是其中D也可以是C矩阵本身,就是直接覆盖。这里的列优先和ld参数,和cublas如出一辙,所以可以先看那片文章的介绍。当然CUTLASS和WMMA的API一样,也提供了行优先的方式,不过官方的例子这里写的还是列优先。
2026-03-09 15:44:02
449
原创 VSCode的微软C++插件不能使用,clangd如何搭配cuda使用?
而clangd会根据编译命令的-I去寻找头文件引用,如果只有上述命令,生成的 compile_commands.json里的-I是没有cuda相关头文件的,所以需要额外加上下面的命令。clangd 现在会直接读取 compile_commands.json 里的命令,但是clangd不认识nvcc的编译命令,所以会一直报错,我们需要让clangd忽略这些内容。在上述文章配置里,我们的C_Cpp配置是给微软的C++配置的,我们也要把C_Cpp有关的配置都给删掉,然后添加下列的clangd配置。
2026-02-24 12:14:57
526
原创 C++笔记:现代C++封装内存池
第一层:Raw Memory Provider(最底层)职责 向 OS / runtime 申请“大块内存”不关心对象类型不关心回收策略对齐的概念对齐就是:如果一个 的地址不是 8 的倍数,在某些平台上:要么 性能极差要么 直接硬件异常alignof(T)含义是:std::max_align_t这是一个 标准库定义的类型(比如MSVC定义如下):标准规定:也就是说:等价于:普通 只保证 对齐这是一个 标签类型(tag type):它的唯一作用是:语义
2026-01-28 21:26:18
404
原创 C++笔记:std::tuple
类模板std::tuple是固定大小的异类值汇集。它是的推广。Types...是tuple所存储的元素的类型。支持空列表。
2026-01-17 19:17:49
674
原创 石子合并模型
有 n 堆石子排成一排,第 i 堆有 ai 个石子。每次只能合并,合并代价等于这两堆石子的总数。合并后形成一堆新石子。问:把所有石子合并成一堆的。输入3(n的大小)8 5 8输出34解释:首先合并8-5成13,代价是13. 合并后石子为13 8.然后合并13-8,代价是21.所以总代价为34。
2026-01-02 23:22:36
312
原创 2025年 吉林大学 分布计算系统 期末真题
名字按结构可分为()和()名字解析方法有两种()、()中有如下共享语义:()、()、()、()发生死锁的四个充分必要条件是:()、()、()、()一个文件有n个副本,使用同步表表决发完成一次更新,共需传送()个报文由局部检查点组成的两种不一致的全局状态为()、()传统的加密方法有两种,他们是()、()在分布式系统中,两种基本的检查点算法分别是()、()
2025-12-18 15:17:36
306
原创 《Linux C编程实战》笔记:mmap
在mmap()1. 文件映射(File-backed mapping)使用真实文件做后端存储特点:修改内存 → 写到文件文件内容被映射进内存文件大小必须足够大,否则会 SIGBUS(访问超界)2. 匿名映射(Anonymous Mapping)匿名映射没有对应的文件,内核从swap 分配私有内存页。-1, 0);没有文件后端,fd 必须为 -1内容初始全是0修改不会写回任何地方对进程来说就像是malloc()分配的一大块内存匿名映射 =malloc 的更底层版本。实际上。
2025-12-12 22:43:56
967
原创 《Linux C编程实战》笔记:socketpair
用于创建。这两个 socket 是,也就是说:A 给 B 写数据B 给 A 写数据两个方向都可行。就像一个,但至于为什么更强大,其实也很好理解,套接字毕竟是和网络相关的,所以网络那一块的高级特性,它也能用。
2025-12-07 14:33:12
644
原创 TensorRT笔记(5):研究timingCache
在里出现了大量的timingCache,但是当时没有取研究这是干啥的,本文就来解析一下。样例都基于上面的文章。
2025-12-02 15:55:42
1345
空空如也
virtualbox虚拟机显示问题
2024-01-30
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅