- 博客(38)
- 收藏
- 关注
原创 [3.3] 阻塞与非阻塞通信 理论+代码
012每个域有五个单元,最后一个域有6个单元。完成消息的接收(数据已经被复制到接收缓冲区中)。此时,直到完成发送和接收,这两个函数会让进程在此处“停住”。假设游走器只能采取整数大小的步长,我们可以轻松地将域在每个进程中划分为大小近乎相等的块。并将域的大小定义为Max - Min + 1,(因为游走器包含。问题描述:给定左右边界Min,Max和游走器Walker。发送和接收操作被立即返回,通信操作在后台继续进行。为 20,并且我们有四个进程,则将像这样拆分域。完成消息的发送(或在缓冲区中完成存储)和。
2025-04-05 14:51:52
348
原创 [3.2] 深入了解recv参数列表里的status
例如,控制端/执行子程序在交换变量大小的消息时通常会大量使用。函数,则操作完成后将在该结构体中填充有关接收操作的其他信息。下一节将通过完整的代码例子说明send和recv为什么是阻塞通信。对象,则可以通过state.MPI_SOURCE访问rank。消息的长度,它在在结构体中没有预定义的元素。在实际接收消息之前查询消息大小。会阻塞具有匹配标签和发送端的消息。发送端的rank,发送端的rank存储在结构体。在库文件中的定义如下,可以看到与。结构体的地址作为参数,可以使用。消息的标签,同上访问方式,访问。
2025-04-05 14:17:46
858
原创 [3.1] MPI的基础结构 & send / recv 机制
消息传递模型?它其实只是指程序通过在进程间传递消息(消息可以理解成带有一些信息和数据的一个数据结构)来完成某些任务。MPI在消息传递模型设计上的经典概念:通讯器(communicator):一组能够互相发消息的进程。在这组进程中,每个进程会被分配一个序号,称作秩(rank),进程间显性地通过指定秩来进行通信。点对点(point-to-point)通信:不同进程间发送和接收操作。一个进程可以通过指定另一个进程的秩以及一个独一无二的消息标签tag)来发送消息给另一个进程。
2025-03-30 18:28:35
670
原创 [3.0] MPI原理+代码实战
笔者目前是北京的一位Ai infra实习生(小卡拉米),上班第一天要求学会儿MPI。资料和学习记录整合成这个专栏,供自己和其他人学习和复习。本系列文章将从 MPI 的基本概念出发,逐步深入点对点通信、集体通信、高级通信操作,最终引导你掌握复杂的 group 与 communicator 管理技巧。无论你是刚接触 MPI 的新手,还是想要系统梳理知识的进阶开发者,这个系列都能为你带来清晰实用的指导。整个学习的过程我是用的C++,所以编译代码的指令是mpic++,运行可执行文件用的是mpirun。
2025-03-30 18:20:16
402
原创 [2.7] variant变体
std::variant是C++17引入的标准库类型,表示多个可能类型中的一个。类似于联合体(union),但是更安全易于使用。union分配的内存只管最大的成员,union的所有成员share同一个内存空间。return 0;/**/这里的int变量是未定义类型但是输出了莫名其妙的东西,所以c++17出现的variant就是为了解决这个潜在的问题。代表一个多类型的容器,容器中的值是制定类型的一种,是通用的 Sum Type,对应 Rust 的enum。是一种类型安全的union。
2025-03-14 17:05:01
780
原创 [2.6] C++11 原子变量 | CAS操作 | 内存顺序
c++11中提供的原子类型,内部变量通过这个原子类型管理后就变为原子变量。原子类型模板参数<T>可以指定bool、char、int、long、指针等类型(不支持浮点类型和复合类型)。原子指一系列不可被CPU上下文交换的机器指令,这些指令组合在一起就形成了原子操作。在多核CPU下,当某个CPU核心开始运行原子操作时,会先暂停其它CPU内核对内存的操作,以保证原子操作不会被其它CPU内核所干扰。由于原子操作是通过指令提供的支持,因此它的性能相比锁和消息传递会好很多。
2025-03-14 17:02:16
878
原创 [2.5] 异步操作(async)--代码结合版
future是一个模板类,也就是这个类可以存储任意指定类型的数据。同时也提供了// 1 默认无参构造函数// 2 移动构造函数,转移资源的所有权// 3 使用=delete显示删除拷贝构造函数, 不允许进行对象之间的拷贝常用的一般情况下使用进行赋值操作就进行对象的拷贝,但是future对象不可用复制。如果other是右值,那么转移资源的所有权如果other是非右值,不允许进行对象之间的拷贝(该函数被显示删除禁止使用)取出future对象内部保存的数据,其中void get()
2025-03-06 11:29:13
1005
原创 [2.3-3]weak_ptr 弱引用的智能指针
时,由于aptr是weak_ptr,它并不会增加引用计数,所以ap的引用计数仍然会是1,在离开作用域之后,ap的引用计数为减为0,A指针会被析构,析构后其内部的bptr的引用计数会被减为1,然后在离开作用域后bp引用计数又从1减为0,B对象也被析构,不会发生内存泄漏。,因为它不共享指针,不能操作资源,主要是为了通过shared_ptr获得资源的监测权,它的构造不会增加引用计数,它的析构也不会减少引用计数,纯粹只是作为一个旁观者来监视shared_ptr中管理的资源是否存在。超出作用域,它的引用计数递减到。
2025-03-03 20:51:55
631
原创 [2.3-2]unique_ptr独占的智能指针
unique_ptr是一个独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将 一个unique_ptr赋值给另一个unique_ptr。// 报错,不能复制但可以通过std::move来转移到其他的unique_ptr,这样它本身就不再拥有原来指针的所有权了。// 正确在c++14当中加入了,c++11中加入的是。使用new的版本重复了被创建对象的键入,但是make_unique函数则没有。());
2025-03-03 20:07:27
405
原创 [2.3节]什么是shared_ptr共享的智能指针?
C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。C++11中引入了智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。C++里面的四个智能指针:unique_ptrshared_ptrweak_ptr其中后三个是C++11支持, 第一个已经被C++11弃用。使用这些智能指针时需要引用头文件<memory>。
2025-02-28 17:49:33
454
原创 [2.2节]lamda表达式
在C++11之后,如果Lamba表达式的函数体内有多个return语句且返回类型不一致,编译器无法自动推断的时候,此时必须显式的指定返回类型。这里使用了bool holds_alternative来判断返回的类型是什么。由于 Lambda 表达式有多个。如果希望去修改按值捕获的外部变量,那么应该如何处理呢?这就需要使用mutable选项,语句且返回类型不同,我们必须显式指定返回类型为。一般情况下,编译器会自动推断出。
2025-02-28 12:21:24
788
原创 [2.1节]CPU怎么实现多线程,互斥锁,条件变量?
从语义上看这里使用lock_guard会产生矛盾,但是实际上并不会出问题,因为wait提前释放锁之后会处 于等待状态,在被notify_one或者notify_all唤醒后会先获取mutex,这相当于lock_guard的mutex在 释放之后又获取到了,因此,在出了作用域之后lock_guard自动释放mutex不会有问题。解锁正在等待当前条件的线程中的一个,如果没有线程在等待,则函数不执行任何操作,如果正在等待的线程多余一个,则唤醒的线程是不确定的。同样,空了之后就不能移除元素,否则会发生下标越界。
2025-02-27 21:26:25
662
原创 深度神经网络(DNN)编译器原理简介
*编译器(compiler)**在计算机编译代码的时候往往指一种程序,会将某种编程语言的源代码(原始代码)转换成另一种编程语言(目标语言),转换的过程中进行的程序优化就是编译优化。Fig. 1 LLVM编译过程(例如cpp编程IR中间表示,然后中端优化,最后给后端编译给机器执行)随着xxxx,现在的model要部署在各类计算设备和不同的硬件架构上(x86, ARM, RISC-V);实际部署对性能需要更多要求,性能的优化能够为算法提供更大的空间。
2025-02-26 23:17:38
1190
原创 windows的vscode配置cuda与TensoRT编译环境-wsl2
点击这里,不用wsl的缺点显然,不可以使用cuda gdb来调试代码,每次都是编译成可执行文件一遍遍测试代码十分累,于是这篇文章诞生。点击这里,如果觉得有帮助,记得点哥star。
2025-01-03 11:39:55
928
原创 Failed to connect to 127.0.0.1 port 7890 after 0 ms: Connection refused解决方案
我的问题是之前给设置的代理是网址后面加代理地址 刚刚看了一堆人的解决方案去清除代理 然后我发现还是报错Failed to connect to 127.0.0.1 port 7890 after 0 ms: Connection refused。只留下了我自己的代理这两行后成果run了。所以我把这两行删除了。
2024-11-11 21:05:20
1070
原创 PIDNet(语义分割)排坑
paper小修时reviewer说baseline太老,所以对CVPR2023的PIDNet进行复现,用于下游任务的baseline。所以写一个记录说明完整的过程,同时要说的是:没有从0开始训练,用的PIDNet作者提供的在ImageNet上训练的预训练权重来继续训练的。数据集我是用的是无人机航拍数据集AeroScapes,VOC格式。解决了两个问题:[1] 基础模型只支持cityscapes和camvid数据集,现在我支持了VOC格式的分割数据集。
2024-10-31 19:00:48
1388
原创 cuda编程[5]:矩阵乘法--使用静态共享内存优化
目录 所有的代码下载链接:https://github.com/leoda1/the-notes-of-cuda-programming/tree/main/code/matmul-shared-memory 这里的普通矩阵乘法的matmul_gpu_basic.cu代码我做了详细的视频解读,视频链接:视频时长32:00,建议2x食用。那么怎么使用静态共享内存来实现矩阵乘法呢? 首先,共享内存空间比局部和全局内存空间更快,对于一个warp 的所有线程,访问共享内存和访问寄存器一样快,只要在线程之间
2024-09-03 21:24:33
564
原创 cuda编程[1]:一二三维网格和块的核函数
code。以下代码展示了如何在 CUDA 中打印网格和线程的索引信息。代码包括一维、二维和三维的网格和块的设置,并定义了多个内核函数来输出当前的索引信息。
2024-09-03 15:53:30
1163
原创 cuda编程[3]:测试CPU,GPU预热,warp无分化和warp有分化
code,在code/test_warp下能看到所有代码,包括.vscode,CMakeLists.txt,和.nsys-rep文件。所有代码和性能分析文件经过测试,可以运行。
2024-08-23 11:59:17
823
原创 cuda编程[2]:怎么用2维网格2维块计算矩阵加法
一个线程在网格中的块的索引是ix = threadIdx.x + blockIdx.x * blockDim.x和iy = threadIdx.y + blockIdx.y * blockDim.y。//查看当前可用GPU设备数 并将可用device设置为0。这样就可以输出结果。
2024-07-25 22:07:31
947
1
原创 cuda编程[0]:怎么调用API看自己的架构并计算核心数量
,这里的device_id就是你的显卡id,默认是0,如果是多卡就是0,1,2这样。看上面的运行图可以看到有一个计算能力结果是8.9,这个是通过device_prop.major和device_prop.minor得到参数,所以我现在这个4060显卡的主次版本号分别是8和9。可以看到这个API的修饰符有__host__和__cudaError_t,意思是这个API在主机中调用,且错误返回的类型是__cudaError_t。可以看到我的4060显卡是安培架构,有3072个cuda核心。这样就可以输出结果。
2024-07-25 14:57:48
706
原创 训练自己的SETR和VIT模型
因为最近在发论文需要对之前的模型复现并记录完整的数据,结果没有找到一个完整的代码可以让SETR在torch框架中训练,有的是缺少dataloader,有的是缺少train.py,有的是只有一个网络结构代码。所以我将SETR和VIT的结构整合在了一起,并且加入了dataloader,训练,预测,评估每个类别的iou、recall等等参数的功能。代码结构如下(目前,持续更新中。。。。。
2024-07-18 11:25:17
996
1
原创 Deeplabv3+训练aeroscapes
修改train.py中的num_classes为12,其他都没动即可训练。,可以直接gitclone也可以下载zip然后解压。将aeroscape数据集改名为VOC2007。predict.py十分详细的中文注释,一键运行。然后变一下结构放到VOCdevkit中,如图。
2024-07-16 14:19:12
406
3
原创 FCN训练Aeroscapes数据集
首先我要用aeroscpaes数据集训练fcn8s,所以开始对examples/voc/train_fcn8s.py中的代码进行修改。train_fcn8s.py中调用train_fcn32s.py的git_hash函数全部删除了,因为这个函数就是输出当前code的版本,这里又会涉及到代理问题,所以删除了不影响。解压model_best.pth.tar,模型现在加载这个model_best.pth测试即可。代码目录结构如下(接下来用的数据集是aeroscapes,所以要改一些数据集加载的代码)
2024-07-16 14:08:17
515
原创 cuda C++ 编程指南 第六章 编程接口(上)
英伟达 《CUDA C++ Programming Guide》 官方文档学习记录笔记 版本【Release 12.4】出版时间【 Apr 22, 2024】 持续更新中。。。。。。
2024-07-12 11:07:47
881
原创 cuda C++ 编程指南 第五章 编程模型(下)
基于 NVIDIA Hopper GPU 架构的设备的主要修订数为 9,基于 NVIDIA Ampere GPU 架构的设备为 8,基于 Volta 架构的设备为 7,基于 Pascal 架构的设备为 6,基于 Maxwell 架构的设备为 5,基于开普勒架构的设备为 3。图灵是计算能力为7.5的设备的架构,是基于Volta架构的增量更新。每个线程都有私有的本地内存,每个线程块对块的所有线程都有可见的共享内存,每个线程块集群中的线程块可以对彼此的共享内存执行读取、写入和同步操作。
2024-06-09 20:12:34
791
原创 cuda C++ 编程指南 第五章 编程模型(上)
1.定义:CUDA C++通过定义C++函数拓展C++,称为内核(kernels)。调用该内核时,由N个不同的cuda线程并行执行N次。2.__global__来定义内核,来执行配置。3.执行时每个线程(thread)有一个单独ID,该ID可以由内置变量再内核内访问。
2024-06-05 19:06:12
590
原创 Autofocusformer的空间聚类用在局部注意力有参考价值吗?
你想知道对应CVPR 2023论文(autofocusformer)的代码是什么逻辑吗
2024-01-23 16:46:55
1237
1
原创 CVPR 2023 autofocusformer核心部分翻译
与此形成对比的是,对于一个无序的点集,确定3D点云中的邻域的传统方法依赖于诸如k近邻(kNN)等算法,它计算点之间的成对距离。有趣的是,许多加速kNN的算法的第一步都是在给定的点上进行k-means聚类,以减少邻域搜索的空间。因为我们可以在O(1)时间内通过简单量化它们的坐标来找到每个tokens对应的空间填充锚点,所以聚类的总体时间复杂度不超过对局部补丁中的所有tokens位置进行一次排序,与网络的时间复杂度相比可以忽略不计,因为没有涉及到特征通道。这是有利的,因为邻域是重叠的,保证了簇之间的信息交换。
2024-01-23 14:27:58
1184
翻译 Prognostics and Health Management (PHM): Where are we and where do we go in theory and practice
We are performing the digital transition of industry, living the 4th industrial revolution, building a new World in which the digital, physical and human dimensions are interrelated in complex socio-cyber-physical systems. For the sustainability of these t
2023-10-16 17:03:18
480
原创 谭浩强C程序设计试题汇编第三版 第九章解析
之前写的全部上传完了 笔者正在读研有些忙 学习c大家还是要自己动手写 一次次debug中领悟c的精髓。
2023-10-10 16:15:31
446
2
原创 谭浩强c程序设计试题汇编第三版 第四章解析
我是谭老的学生 但是居然他的书没有解析!第四章节部分 暂未写完 等待后续欢迎一起交流这本习题!
2022-10-30 21:37:40
1117
16
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人