- 博客(59)
- 收藏
- 关注
原创 C语言基础:指针
想象一下,计算机的内存就像一条非常非常长的街道,街道两边有无数个连续的小房子。每个房子都有唯一的一个门牌号码,我们称之为内存地址。计算机就在这条“内存街道”上找一间空房子(分配一块内存),在里面放上值10,并告诉你这间房子的门牌号(地址)。概念语法说明声明指针int *ptr;声明一个指向int的指针取地址ptr = &var;将变量var的地址赋给ptr解引用获取ptr指向地址的值指针运算ptr++移动到下一个int的地址数组关系ptr = arr;数组名可视为首元素地址动态分配malloc()
2025-12-31 14:26:56
961
原创 CUDA 13.1推出的CU-Tile给compiler带来挑战
你可以把它理解为从“手工作坊”到“自动化流水线”的转变。特性维度传统CUDA (SIMT模型)全新CUDA Tile模型核心编程单元线程(Thread)和线程块数据块(Tile),即多维数组的子集抽象层级底层,需精细控制线程、内存、同步高层,开发者定义数据块及运算,底层由编译器自动处理硬件亲和性直接操作通用计算核心天然亲和并**抽象化张量核心(Tensor Core)**等专用硬件主要开发语言CUDA C/C++首先支持Python(cuTile Python),C++支持后续推出核心任务。
2025-12-09 16:04:19
871
原创 cudaGetDriverEntryPoint
需注意,若此调用尝试初始化内部 CUDA RT 状态,该函数还可能返回 cudaErrorInitializationError、cudaErrorInsufficientDriver 或 cudaErrorNoDevice 错误。根据 cudaStreamAddCallback 的规定,回调函数中不得调用任何 CUDA 函数。此类情况下可能(但不保证)返回 cudaErrorNotPermitted 作为诊断信息。是CUDA编程中一个用于运行时动态绑定特定版本驱动API的高级工具。
2025-11-14 16:58:14
882
原创 句柄(Handle):引用标识符
句柄是一个抽象的引用标识符,它代表对某个系统资源(如内存、文件、窗口等)的访问权,但不是直接的指针地址。句柄的核心价值抽象:隐藏实现细节安全:防止直接操作资源灵活:系统可以重新组织资源而不影响用户跨进程:可以在不同进程间安全传递在CUDA IPC中,句柄机制使得不同进程可以安全地共享GPU资源,而无需关心底层的设备内存管理和地址映射细节。
2025-11-03 16:10:32
425
原创 Persisting L2 Cache
这是一种用空间换时间的优化策略,需要开发者根据具体应用场景来合理使用。✅ 优化重复访问模式的应用性能。✅ 提高关键数据的访问速度。✅ 减少内存带宽压力。
2025-10-28 14:52:36
102
原创 cudaDeviceEnablePeerAccess()解析
注意:若本调用尝试初始化内部CUDA实时状态,则可能返回cudaErrorInitializationError、cudaErrorInsufficientDriver或cudaErrorNoDevice错误。若cudaDeviceCanAccessPeer()指示当前设备无法直接访问peerDevice内存,则返回cudaErrorInvalidDevice。若当前设备已启用对peerDevice的直接访问,则返回cudaErrorPeerAccessAlreadyEnabled。
2025-10-17 10:28:14
200
原创 C语言基础:内存管理
C语言的内存管理赋予了程序员极大的灵活性,但也带来了巨大的责任。核心是理解栈和堆栈:自动、快速、生命周期短。用于局部变量和函数调用。堆:手动、灵活、生命周期长。用于动态数据结构和大内存需求。牢记 malloccalloc和 free必须成对出现,并养成良好的编程习惯,是避免内存问题、写出高质量C程序的关键。
2025-09-04 18:04:33
621
原创 计算机组成原理:CPU和GPU的交互,比如PCIe总线、数据传输优化等
PCIe是一种高速串行计算机扩展总线标准,它是CPU与GPU、NVMe SSD、网卡等外部设备通信的主要通道。从计算机组成原理的角度看,CPU与GPU的交互本质是两个独立内存系统通过PCIe总线进行通信。优化黄金法则:最小化PCIe数据传输。首要优化使用页锁定内存(Pinned Memory)进行数据传输。这是所有异步和重叠操作的基础。高级优化使用流(Streams)和异步函数来重叠数据传输与内核执行,最大化利用PCIe带宽和GPU计算资源。审视你的算法:从根本上思考是否真的需要频繁交换数据。
2025-09-04 17:51:05
1204
原创 计算机组成原理:GPU架构、并行计算、内存层次结构等
最大化并行度: 启动足够多的Thread和Block来隐藏内存延迟,让SM始终保持忙碌。优化内存访问尽力实现全局内存的合并访问。积极使用来缓存数据,减少对全局内存的访问。避免分支分化: 确保同一个Warp内的线程尽可能走相同的执行路径。Occupancy(占用率)**: 衡量SM上活跃的Warp数与最大可能支持的Warp数之比。较高的占用率有助于隐藏延迟,但并非越高越好,需要与寄存器/SMEM的使用做权衡。理解这些底层机制,你就能从“程序员”升级为“优化专家”,真正释放GPU的强大计算潜力。
2025-09-04 17:47:18
1549
原创 解决HAL层调用Driver层代码的架构问题
/ hal_interface.h (位于HAL工程)// 定义Driver需要实现的回调接口// 注册回调的函数// driver_services.h (位于HAL工程)// 前置声明public:// 设置具体实现的函数在您的架构中,HAL层不应该直接调用Driver层代码。回调函数/接口注入(最简单直接)事件/消息系统(更解耦,适合复杂交互)依赖倒置原则(最面向对象,适合大型系统)
2025-08-28 16:54:46
472
原创 cudaDeviceSetFlags的四个flag是什么
cudaDeviceScheduleBlockingSync:选择低CPU占用,CPU一旦开始等待GPU,就进入睡眠状态并且释放其占用的CPU核心,直到GPU发出中断信号。cudaDeviceScheduleYield:选择平衡 低延迟 +低 CPU占用,CPU线程等待GPU一段时间后,会主动让出当前占用的CPU核心。cudaDeviceScheduleAuto:默认值,系统根据活跃CUDA上下文数(C) 和系统的逻辑CPU核心数(P)自动选择。如果 C <= P,它倾向于选择 Spin,以追求更低延迟。
2025-08-27 17:08:48
152
原创 操作系统:系统调用、进程间通信等
这是 GPU IPC 最核心的应用场景。进程间需要共享大的计算结果或输入数据时,直接拷贝到系统内存再传给另一个进程效率极低。GPU 驱动是连接用户程序(如 CUDA/OpenCL 应用)和硬件(GPU)的核心。用户态的 CUDA/OpenCL 运行时库只是一个“包装器”,其最终都会通过系统调用来请求内核态的驱动服务。,使得 CUDA 和 OpenCL 能够实现高效的进程间显存共享和同步,从而充分发挥多进程协同计算的能力。当多个进程需要共享 GPU 资源或交换数据时,IPC 机制就变得至关重要。
2025-08-20 13:58:42
1181
原创 操作系统:资源竞争或者同步问题;锁、信号量等机制
层级化同步graph TDA[进程级] -->|cudaIpcMemHandle_t| B[设备级]B -->|cudaStream_t| C[线程块级]C -->|__syncthreads()| D[线程级]避免细粒度锁用原子操作替代锁(如atomicAdd使用线程束同步()替代块同步零拷贝优化// CUDA 统一内存优先级控制// 高优先级流通过操作系统的DRM/WDDM 子系统毫秒级进程切换(上下文保存/恢复)微秒级线程同步(硬件原子操作)零开销数据传输(UMA/SVM)
2025-08-20 13:55:36
557
原创 GPU的barrier
Barrier 是 GPU 并行的关键同步原语:1. 硬件支持:专用电路实现高效同步2. 资源开销:消耗额外寄存器(每线程 1-2 个)3. 正确使用:避免死锁,确保内存一致性4. 性能优化:减少次数、使用 warp 同步5. 占用率影响:需在寄存器计算中考虑其开销理解 barrier 的底层机制,对编写正确、高效的 GPU 代码至关重要。新一代 GPU(如 Hopper)通过异步 barrier 进一步提升了同步效率。
2025-07-17 14:19:52
1038
原创 cudaOccupancyMaxActiveBlocksPerMultiprocessor配置内核的线程块大小
cudaOccupancyMaxActiveBlocksPerMultiprocessor 是 CUDA 开发者优化内核启动配置的核心工具,其价值在于:1. 自动化 - 替代复杂的手工计算/电子表格;2. 动态适配 - 支持运行时根据硬件选择参数;3. 资源可视化 - 明确揭示寄存器/共享内存对并发性的限制。建议结合 cudaOccupancyMaxPotentialBlockSize 使用,实现一键生成最优配置。对于需要极致优化的场景,需在占用率和指令级并行(ILP)间权衡。
2025-07-16 16:33:08
642
原创 CUDA kernel中的延迟函数怎么写
在 CUDA 内核中,没有直接的 nanosleep 函数,因为 GPU 的并行执行模型与传统 CPU 操作系统有根本差异。不过,可以通过几种方法实现类似"睡眠"的延迟效果。
2025-07-16 15:31:26
603
原创 解析cuStreamBeginCapture
cuStreamBeginCapture是 CUDA Graph API 中的核心函数,用于(Stream Capture),将异步操作序列转换为的计算图(CUDA Graph)。
2025-07-15 14:09:31
870
原创 操作系统内核链表操作接口
这些基础链表操作构成了操作系统内核的核心基础设施,其设计直接影响系统的稳定性和性能。(如Linux、FreeBSD等)或。
2025-07-11 15:13:33
215
原创 mmu 是什么?core和die是什么?
一块 **Wafer (晶圆)** 上制造出很多个 **Die (晶粒)**。* 一个 **Die (晶粒)** 上集成了构成处理器功能所需的所有电路元件。* 在一个 Die 的内部,通常会包含多个 **Core (核心)**,每个 Core 是一个独立的处理单元。* 每个 Core 内部或附近,都包含(或共享)了支持其运行的部件,其中就包括 **MMU (内存管理单元)** 的相关电路(虽然 MMU 的某些部分可能被多个核心共享,但其功能是为每个核心的内存访问服务的)。
2025-07-10 16:30:02
1307
原创 C/C++语言基础之栈stack(包含C++ 容器适配器std::stack介绍)
目录C/C++语言基础之数据结构一、线性数据结构二、非线性数据结构栈stack:后进先出(LIFO,Last-In-First-Out)一、栈的基本概念与特性二、栈的典型操作三、类比理解:栈 vs. 先进先出(FIFO)四、栈的应用场景五、栈的实现方式C++ 容器适配器std::stack一、基本用法二、底层容器选择三、常用接口四、应用场景五、注意事项六、自定义栈实现(简化版)总结其中,数据结构是计算机存储、组织数据的方式,用于高效地操作和管理数据。以下是常见的数据结构分类及具体类型:线性数据结构中的元素按
2025-07-04 17:31:40
872
原创 ccache: error: failed to create directory /home/cache/ccache /1/d: Disk quota exceeded解决办法
我是执行ccache -C清理缓存后还不行,就export CCACHE_DIR =一个大容量的本地分区,这样解决的。
2025-06-16 18:00:07
295
原创 linux中执行脚本命令的source和“.”和“./”的区别
3. 修改当前 shell 的状态,如改变工作目录、设置 shell 选项等;1. 执行独立的脚本程序,不需要与当前 shell 共享环境变量或状态时;1. 加载环境变量配置文件,无需重新启动终端;2. 执行编译后的可执行文件;2. 加载函数定义;
2025-06-12 18:26:59
488
原创 C标准库函数:字符串操作
/ 自定义 strcpy 函数= '\0') {dest++;src++;// 添加字符串结束符return 0;// 自定义 strlen 函数= '\0') {len++;str++;return len;return 0;通过以上介绍,你可以了解到C语言中标准库提供的字符串操作函数以及如何自定义字符串处理函数。在实际使用中,要注意缓冲区溢出的问题,确保程序的安全性。
2025-05-27 16:30:11
766
原创 【报错解决方案】cannot open shared object file: No such file or directory
通常表明系统无法找到或者无法加载名为xxx.so的共享库文件。:系统上可能根本没有安装所需的库文件。:即使库文件存在,如果其路径没有被包含在系统的库搜索路径(如环境变量)中,也会导致此错误。:库文件可能已损坏,或者应用程序需要的库版本与系统中安装的版本不匹配。1. 确认库文件是否存在首先,你需要确认文件是否真的存在于你的系统中。如果找到了文件,请确保它的路径是正确的。2. 设置如果找到了库文件,但不在标准库路径中,你可以通过设置环境变量来包含该路径。例如,如果库位于然后再次尝试运行你的程序。
2025-05-27 15:07:31
1050
原创 mark一个嵌套结构体的调用,再怎么重定义都只看最后一个,比如下面的E
【代码】mark一个嵌套结构体的调用,再怎么重定义都只看最后一个,比如下面的E。
2025-05-23 10:58:35
153
原创 __shared__、__managed__、__device__修饰的内存和初始化
虚拟内存,底层映射到GPU、CPU内存。CPU通过CUDA API来访问。CPU、GPU数据共享。
2025-03-06 14:47:37
136
原创 只写char是有符号还是无符号呢
在C语言标准中,**`char` 的符号性(是否有符号)是由实现定义的**,这意味着它可以是 `signed char` 或 `unsigned char`,具体取决于编译器和目标平台。- 在 **x86/x64 架构** 上,大多数编译器(如 GCC、MSVC)将 `char` 定义为 **有符号的**(`signed char`)。- 在 **ARM 架构** 上,通常将 `char` 定义为 **无符号的**(`unsigned char`)。### **1. 默认 `char` 的符号性**
2025-02-22 10:56:49
381
原创 GPU和FPGA的区别
GPU(Graphics Processing Unit,图形处理器)和 FPGA(Field-Programmable Gate Array,现场可编程门阵列)不是同一种硬件。我的理解是,虽然都可以用于并行计算,但是GPU是纯计算的硬件,FPGA是控制+计算的可编程的硬件。FPGA有点像CPU,区别在于,CPU的硬件是固定的,而FPGA的硬件是可编程的。如若理解有偏差,烦请指出,多谢!
2025-02-19 14:48:59
1117
原创 《A Philosophy of Software Design》(《软件设计的哲学》)适合成熟的软件开发工程师阅读,增长功力
**避免信息泄漏**:防止模块之间共享不必要的信息,避免一个模块的实现细节影响到其他模块。- **简单而清晰的接口**:接口应该简洁明了,只提供必要的功能,避免过多的参数和复杂的调用方式。- **复杂度的来源**:详细阐述了复杂度可能来源于不必要的依赖关系、重复代码、不清晰的接口设计等。- **增量式设计**:提倡采用增量式的设计方法,逐步构建系统,而不是一开始就试图设计出一个完美的系统。- **复杂度的定义**:书中将复杂度定义为“任何使得软件系统难以理解和修改的因素”,包括代码的耦合性、模糊性等。
2025-02-17 16:37:36
446
原创 C 编程语言时使用的特定术语和概念的定义
它们经过翻译成为可执行程序,在操作系统调用其主函数时执行(除非它本身就是操作系统或其他独立程序,在这种情况下,入口点是由实现定义的)。每个标识符(宏除外)只在程序中称为其作用域的部分有效,并属于四种名称空间之一。有些标识符具有链接性,当它们出现在不同的作用域或翻译单元中时,会指向相同的实体。其他词可以用作标识符,用来标识对象、函数、结构体、联合体或枚举标记、其成员、类型定义名称、标签或宏。函数的定义包括语句和声明序列,其中一些还包括表达式,它们指定了程序要执行的计算。
2025-02-10 16:00:40
212
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅