- 博客(138)
- 收藏
- 关注
原创 《C++ 并发编程实战》一些示例代码段
在线程中可能访问局部变量的引用或者地址,但是在执行过程中该变量会被释放,导致线程运行出错,比如下面的例子因为线程分离了,local_val就有可能被回收。直接的修改方式就是把detach改为join,这样只有等到线程使用完, local_val才会被回收。对于一个线程如果不将它分离(detach),那么就要记得对它调用join。问题是并不是每次都会记得,甚至记得了也不一定能调用成功,比如下面的示例:如果要确保会调用join,需要捕获异常 这样非常麻烦,因为需要对所有可能出现异常的地方都使用
2025-08-05 11:59:07
996
原创 2025年 吉林大学 分布计算系统 期末真题
名字按结构可分为()和()名字解析方法有两种()、()中有如下共享语义:()、()、()、()发生死锁的四个充分必要条件是:()、()、()、()一个文件有n个副本,使用同步表表决发完成一次更新,共需传送()个报文由局部检查点组成的两种不一致的全局状态为()、()传统的加密方法有两种,他们是()、()在分布式系统中,两种基本的检查点算法分别是()、()
2025-12-18 15:17:36
234
原创 《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
880
原创 《Linux C编程实战》笔记:socketpair
用于创建。这两个 socket 是,也就是说:A 给 B 写数据B 给 A 写数据两个方向都可行。就像一个,但至于为什么更强大,其实也很好理解,套接字毕竟是和网络相关的,所以网络那一块的高级特性,它也能用。
2025-12-07 14:33:12
583
原创 TensorRT笔记(5):研究timingCache
在里出现了大量的timingCache,但是当时没有取研究这是干啥的,本文就来解析一下。样例都基于上面的文章。
2025-12-02 15:55:42
1214
原创 gprc静态库链接顺序究竟要怎样
由于我通过grpc源码编译生成的库没装到系统目录,cmake的find_package不太好使,虽然grpc可以找到包,但是grpc依赖的protobuf找不到,所以只能手动链接静态库了。被grpc的静态库链接恶心了几个小时,经过我的精心调试,终于把依赖搞对了,特此记录。这些absl的包必须有依赖顺序,免得以后调顺序,直接抄我的顺序即可。下面是cmake+Linux,注意不要搞错。
2025-11-25 16:43:02
155
原创 C++笔记:std::string_view
是 C++17 引入的。它不拥有字符串,只是“指向一段连续字符”的二元组。避免创建临时、减少拷贝,提高性能。字面量并且。
2025-11-24 19:44:54
550
1
原创 C++笔记:std::stringbuf
public://拷贝应该是禁止的,我这里偷懒没写了~LogBuffer()override {//重要,这个得重写//防止有残留数据留在缓冲区//重要,flush,endl会调用syncreturn 0;private://清空//会把hello输出//逻辑是这样的,myostream的<<只会把数据输入到LogBuffer的缓冲区里面,并不会输出到屏幕//<<std::endl,LogBuffer内部调用sync,std::cout这时候才把缓冲区的内容进行输出。
2025-11-23 20:31:57
944
原创 TensorRT笔记(3):解析样例中BufferManager类的设计
在里,我只是提了一下BufferManager,因为整体比较多,专门放在本文来讲。可以具体对比一下,这篇文章的推理过程,涉及了GPU内存的申请释放,为了不显示管理GPU内存,所以官方封装了BufferManager类,避免混乱。
2025-11-16 19:39:06
587
原创 TensorRT笔记(2):解析样例中Logger日志类的设计
在我把Logger这个类给贴出来了,但是关键的实现机制并没有详细讲解这个Logger类继承了nvinfer1::ILogger,最关键的重写log方法实现如下很明显这个log方法委托给了LogStreamConsumer这个类取实现。而且LogStreamConsumer这个类样子上就很明显像std::ostream的使用方法。下面就从头开始分析这个类的实现。
2025-11-11 19:56:53
713
原创 TensorRT笔记(1):自定义MNIST数据集推理类
阅读之前,可以先看,了解TensorRT最基础的执行流程。本例就是对该流程的封装。在前文已经介绍过的api,本文就不再介绍了。注意:示例代码里用到了许多common文件夹里的官方定义的类,在介绍时会一并介绍。自己如果想要运行也要注意这些头文件和cpp文件,以免编译不过。
2025-11-08 17:07:09
771
原创 C++笔记:std::variant
✅事件分发系统(代替 switch case)解析器或状态机(多分支结果)GUI / 网络消息(多种 payload)异步任务结果替代多态的轻量数据结构🚫类型数量极多(上百种);类型不固定(动态插件系统);存储不确定类型(那用std::any更好)。
2025-11-01 16:35:51
834
原创 cuda编程笔记(35)-- Cooperative Groups
这是 CUDA 的,属于,它在普通的 block / warp 层次之上引入了。
2025-10-30 16:55:54
647
原创 cuda编程笔记(34)-- 内存访问控制与缓存提示
缓存层作用范围容量一致性可写典型用途每个 SM 独立小(128KB~192KB)不全局一致可写局部数据缓存每个 SM 独立小(48KB~128KB)无需一致性只读常量、查表L2 Cache全 SM 共享大(几 MB)全局一致可写跨 SM 通信、共享数据。
2025-10-27 15:48:12
984
原创 cuda编程笔记(33)--Thrust库的使用
Thrust 所有容器都支持通过模板参数指定 allocator。可以自定义一个分配器,让它使用和。// ---------------- 自定义 pinned allocator ----------------// 分配:用 cudaHostAlloc 分配固定页内存if (err!return ptr;// 释放:用 cudaFreeHost// 必须定义比较操作符(allocator 要求)
2025-10-26 20:28:52
956
1
原创 cuda-NCCL笔记(5)-- OpenMPI与NCCL的混用
那么流程就很清楚了,一个进程初始化ID,通过MPI的接口广播给所有进程,进程通过这个ID建立NCCL通信组然后再进行GPU通信,比纯OpenMPI更快。ncclGetUniqueId这个函数生成一个全局通信标识符。这个 ID 只需要在一个进程中生成(通常 rank=0),再通过。ncclCommInitRank需要输入参数id,即所有进程共享的ID。
2025-10-23 15:25:56
267
原创 cuda编程笔记(32)--OpenMPI的使用
如果你有权限,可以用sudo apt等方法安装,下面我们介绍通过源码生成(能用cuda)的方式① 下载源码② 配置编译选项重点是--prefix和:告诉编译系统安装到:启用 CUDA 支持(前提:系统已有:允许 C++ MPI 程序(mpic++③ 编译并安装④ 设置环境变量在~/.bashrc最后加上以下几行(或使用⑤ 检查是否支持 CUDA。
2025-10-22 16:23:20
1093
原创 cuda编程笔记(31)-- 一些设备级控制API
返回。单位是 GPU 核心的时钟周期(不是秒)。这个计数器从 GPU 启动后一直累加,直到溢出。对比clock()clock()返回 32 位计数器(容易溢出)。clock64()返回 64 位计数器,更适合长期计时或者需要高精度的测量。使用场景:线程内微基准可以统计单个线程执行某段代码的 GPU 时钟周期。注意,clock64()返回的是。不同 SM 上线程的clock64()可能不是同步的,所以跨 SM 的比较不精确。比如调试原子操作、共享内存延迟、warp 内 shuffle 等操作的开销。
2025-10-21 15:45:23
842
原创 cuda编程笔记(30)-- CUDA算子给python调用
我们知道深度学习里,虽然接口语言是python,但是实际上还是调用的cuda代码。那么我们自己写的cuda代码该怎么提供给python调用?最普遍的一种方法就是把C++/cuda代码导出成库,然后用python的ctypes包去调用不过本文将专门使用PyTorch提供的转换方法。
2025-10-17 16:57:25
908
原创 cuda编程笔记(29)-- CUDA Graph
类型含义表示一个图(Graph),由若干节点(kernel/memcpy/memset 等)和依赖关系组成。表示图中的一个节点(Node)。表示图的“可执行版本”(Executable Graph),通过创建,可直接执行。1️⃣创建一个空的 CUDA 图。pGraph:输出参数,用于返回创建的图对象;flags:目前必须为0(保留字段)。2️⃣销毁图对象,释放相关资源。
2025-10-14 15:56:53
883
原创 cuda编程笔记(28)-- cudaMemcpyPeer 与 P2P 访问机制
P2P 是指不同 GPU 能够直接访问彼此的显存(Device Memory),无需经过 CPU 或主机内存。如果两个 GPU 不在同一个 PCIe 根复合体(root complex),P2P 可能不可用;启用后,对方显存指针可以直接被访问(比如 kernel 从另一 GPU 的缓冲区读数据);一张 GPU 可以直接读取另一张 GPU 的 global memory;,可以直接在两个不同 GPU 设备之间传输数据,而不需要中转到主机内存。可以用 GPU-GPU 通道直接传数据;当两个 GPU 支持。
2025-10-13 15:45:52
517
原创 cuda编程笔记(27)-- NVTX的使用
NVTX用于在代码中插入和,方便在等工具中可视化性能分析信息。下面介绍NVTX的C风格接口,使用时需要#include <nvtx3/nvToolsExt.h>
2025-10-11 15:39:07
854
原创 cuda编程笔记(26)-- 核函数使用任务队列
在cuda的核函数里,似乎也可以这么设计,每个线程都去取任务干活。但是为了利用GPU的多线程的特性,可以将取任务的单位归属到block,一个block认领一个任务后,由block内的线程共同处理。这样即做到了任务队列解耦,还利用了GPU的多线程特性。在CPU的多核编程里,经常有这种生产者消费者的场景:生产者线程往任务队列丢任务,消费者线程在任务队列取任务去干活。各个 Block 协作,从队列里取任务(每个 Block 消费一个任务);至于生产者消费者的异步模型,则可以通过cuda里的流来进行实现。
2025-10-09 19:09:36
247
原创 C++笔记:实现小型日志系统
构造函数里起线程,析构函数里 join,避免悬挂线程。:时间戳 + 等级 + 消息,基本的日志需求都有了。会唤醒所有等待线程,避免死锁。,保证只有一个日志系统。
2025-10-03 13:36:42
281
原创 cuda编程笔记(25)-- 如何像函数对象一样使用核函数
在C++中,函数可以被归类为可调用对象,可以像参数一样传给其他函数。那么cuda里的核函数想要实现这样的效果应该怎么办呢?很明显,核函数不可以像普通函数一样被抽象成可调用对象传给std::function,那应该怎么实现?是一个特殊的标识符,表示“把传进来的所有可变参数原封不动填进去”。既然高级语言的抽象用不了,只能使用低级的方式了,那就是宏定义。就像函数声明参数,然后函数体里使用参数一样。语法有关,和 CUDA 本身没关系。这样想调用哪个核函数,都可以用这个宏。是宏定义时的“声明”是宏展开时的“使用”
2025-09-30 18:15:05
215
原创 cuda编程笔记(24)-- Global Memory之间的拷贝
全局内存慢→ globalCopy 最慢共享内存快 + warp 重叠→ 虽然多了拷贝,但每个线程对全局内存访问少了一次,速度提升→ float4 减少 memory transaction 数量,也接近共享内存速度💡 简单理解:GPU 的瓶颈不是“计算”,而是全局内存访问延迟和带宽。把数据先放共享内存,相当于一次全局内存读,多次快速访问共享内存,整体就快了。
2025-09-30 14:07:47
371
原创 cuda编程笔记(23)-- __threadfence()和__ldg()
是 CUDA 里的一个,用来保证线程在。它不会让线程阻塞等待其他线程,而是单纯限制编译器和硬件对内存操作的重排序。在 GPU 上,线程对全局内存的写入可能会被等机制延迟。调用后,CUDA 会强制将当前线程在调用之前的所有写操作“刷出”,保证:本线程写入的全局内存数据;内存访问不会跨过这个栅栏被重排序。,不会因为 GPU 的优化而打乱。只保证当前线程块(block)内的线程可见。保证整个 GPU 设备上的所有线程可见。保证写入对和其他 GPU 设备也可见。上面例子里,如果没有。
2025-09-30 11:31:25
1164
原创 cuda编程笔记(22)-- NVIDIA Triton Inference Server
(以前叫 TensorRT Inference Server)。作用:在生产环境里,不用每个模型自己写推理服务。特点:支持支持,提升 GPU 利用率。提供,方便接入后端系统。内置等性能优化机制。
2025-09-25 16:39:39
864
原创 cuda编程笔记(21)-- TensorRT
TensorRT 是什么NVIDIA 的深度学习推理引擎(Inference SDK),专门优化在 GPU(尤其是 Tensor Core GPU)上运行的神经网络推理。特点是:高吞吐量(throughput)低延迟(latency)支持 FP32 / FP16 / INT8 / (部分 GPU 上支持 FP8)你可以把它理解为 模型推理加速器,类似 PyTorch → ONNX → TensorRT 的 pipeline。TensorRT 的基本流程通常使用 TensorRT 有三个步骤:模型导入从 ON
2025-09-23 14:21:00
985
原创 cuda-NCCL笔记(4)-- AllReduce 的两类主要实现方式
特性Ring-basedTree-based延迟O(N) 轮O(log N) 轮带宽利用率高(链路全利用)较低(链路部分利用)小规模集群更优可能性能差大规模集群延迟太高更适合(尤其 >1000 节点)
2025-09-17 16:37:57
1029
原创 cuda编程笔记(20)-- 混合精度计算
背景:为什么要用混合精度问题:现代深度学习模型越来越大,计算量巨大,显存占用高。目标:降低显存占用 → FP16 (半精度) 占用 FP32 的一半。提升计算吞吐量 → NVIDIA GPU 上 Tensor Core 对 FP16 计算有专门加速。保持训练稳定性 → 梯度累加或缩放保持 FP32 精度的数值稳定。所以出现了 混合精度训练 (Mixed Precision Training):前向、反向大部分用 FP16 计算。梯度累加和权重更新用 FP32 以避免精度丢失。精度介绍在 C++ / CUDA
2025-09-16 17:01:22
840
原创 cuda编程笔记(19)-- Transformer注意力机制的实现
Transformer里,注意力机制是核心组件,本文将用cuda手写注意力机制模块。由于Encoder和Decoder里的注意力有掩码之分,在本文实现里,统一忽略掩码;训练时QKV的L都是相同的,但是推理时不同,本文暂且只写forward,所以L也默认都是一样的先理清注意力层的步骤。
2025-09-12 16:53:07
756
原创 cuda+VSCode+CMake!一文搞定所有配置信息
👉 只是语法高亮 + 语言模式识别。👉 告诉 C++ 插件用 CMake 的编译参数。👉 把 CMake Tools 的 kit/build type 同步给 C++ 插件。terminal.*👉 设置 VSCode 内置终端用什么 shell。
2025-09-10 15:41:43
835
1
原创 cuda-NCCL笔记(3)-- 分布式训练LeNet
有了nccl,我们就可以尝试做分布式训练了,刚好之前也写了LeNet这个类,就把它们结合起来,做一个分布式的训练;本例子需要Linux环境,并且该主机上需要有两个GPU才能运行首先是LeNet的训练数据集MNIST,train-images-idx3-ubyte与train-labels-idx1-ubyte;这两个文件网上都可以找到压缩包,下载并解压即可得到这两个二进制文件。对于pytorch,有自带的api去读取,对于C++,只能自己去实现数据的读取了。
2025-09-10 13:25:30
236
1
原创 cuda-NCCL笔记(2)-- NCCL的几种传播方式
函数功能数据流向应用场景root → all1 → n模型参数分发ncclReduceall → rootn → 1梯度聚合all → alln ↔ nDDP 梯度同步all → 部分n → n(切分)部分 → alln ↔ n参数/数据拼接。
2025-09-10 13:09:43
398
原创 cuda-NCCL笔记(1)-- 初步了解使用NCCL
单 GPU→ 不用 group API 也没问题。多 GPU 同线程→ 建议使用,尤其是 AllReduce、Broadcast 这种涉及所有 GPU 的 collective 操作。多线程每线程一个 GPU→ 每线程只处理自己的 GPU,一般不需要 group API。下一节,会尝试多线程每个线程一个GPU的模式。
2025-09-06 12:35:24
1444
原创 如何在没有权限的服务器上下载NCCL
由于服务器上像区一样没有权限,所以有关sudo apt的所有功能都用不了,我们只能想办法直接下载头文件和库。然后用scp给它传到服务器(这个得服务器能接受scp);反正就想办法把本地文件传到服务器,不然肯定没招。幸好NCCL会发布打包好的资源,去这个网址找。找到适合自己cuda版本的,下到自己的主机上。这样就有要用的头文件和库文件了。然后在服务器解压,比如。
2025-09-05 16:59:50
232
空空如也
virtualbox虚拟机显示问题
2024-01-30
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅