- 博客(66)
- 收藏
- 关注
原创 梯度检查点
梯度检查点(Gradient Checkpointing)是一种深度学习优化技术,主要用于减少在神经网络训练过程中的内存占用。这项技术通过在前向传播时保存部分激活值的信息,并在反向传播时重新计算其他激活值,从而减少内存的使用。
2024-12-23 14:55:26
369
原创 字面量常量(Literal Constant)
在编程和计算机架构中,字面量常量(Literal Constant)是指在程序代码中直接给出的固定值,这些值在编译时就已经确定,并且在程序执行过程中不会改变。在GPU的指令集中,支持字面量常量可以使得程序在执行时更加高效,因为GPU可以设计指令来直接使用这些嵌入的常量,而不是通过访问内存来获取它们。这可以提高程序的执行效率,尤其是在处理大量数据且常量值在多个操作中重复使用时。对于32位整数或浮点数的字面量常量,这意味着这些常量的值在程序执行期间是固定的,并且它们的数据宽度为32位。
2024-10-15 19:31:28
232
原创 tiling description
tiling description定义了如何将大规模的计算任务分割成适合GPU并行处理的小块,这有助于最大化共享内存(shared memory)的使用效率,减少对全局内存(global memory)的访问频率。它通过模版参数的形式,使开发者能够根据特定的工作负载(workload)调整计算任务的切分方式,从而找到性能最佳的配置。例如,通过调整矩阵乘法操作中的tile大小,可以使计算任务更加符合硬件特性和计算模式,从而实现性能的最大化。初步记录一下,更多细节待补充...
2024-10-15 09:37:56
314
原创 添加环境变量
~/.profile` 文件通常用于全局环境变量和程序的启动脚本,它在用户登录时被读取。要永久添加环境变量,你确实可以将相关的命令添加到你的 `~/.bashrc` 或 `~/.profile` 文件中。- 如果你使用的是非 Bash shell(如 Zsh),你可能需要编辑对应的配置文件,如 `~/.zshrc`。这里,`/your/new/directory` 是你想要添加到 `PATH` 的目录路径。- 在添加路径到 `PATH` 环境变量时,确保不要重复添加相同的路径,这可能会导致性能下降。
2024-10-09 16:50:50
2032
原创 bin文件夹
是一个非常重要的目录,因为它包含了系统启动和运行所必需的最基本的命令。用户通常不需要手动管理这个目录,因为安装的软件包管理器会自动处理这些文件的安装和更新。目录通常用于存放可执行文件,也就是二进制文件。:Shell 脚本或其他类型的脚本,如果被设置为可执行,也可以放在这个目录中。目录,用于存放用户个人常用的脚本和程序。这个目录的路径通常会被添加到用户的。环境变量中,使得用户可以方便地从任何位置调用这些程序。:用户安装的程序,如果它们是可执行的,也可以放在。此外,用户的主目录下也可以有一个。
2024-10-09 16:28:40
938
原创 边学边用docker- docker run -it命令
docker run 是 Docker CLI(命令行界面)用来创建并启动一个新容器的命令。-it 是两个参数的组合,用于分配一个伪终端并保持 STDIN 打开,即使不附加到容器终端。当你执行这个命令时,你将被置于一个交互式的 Bash 会话中,可以执行命令,就像你直接在 Ubuntu 系统上操作一样。-i : 保持容器的标准输入(STDIN)打开,即使不附加到容器终端。这使得你可以与容器进行交互,就像你在一个真实的终端上一样。docker run : 创建一个新的容器并运行一个命令。
2024-10-09 15:26:21
2104
原创 边学边用docker-为什么要进到容器里面修改权限
请注意,容器重启后,之前修改的权限可能会丢失,除非你使用了 Dockerfile 中的 RUN chmod 命令来设置初始权限,或者使用了卷(volume)来持久化数据。在 Docker 容器中修改文件夹权限,通常需要进入容器内部来执行命令,这是因为 Docker 容器提供了一个隔离的环境,其内部的文件系统与宿主机是隔离的。1. 隔离性:Docker 容器设计为轻量级的隔离环境,每个容器都有自己的文件系统。6. 操作习惯:在容器内部修改权限是一种常见的操作习惯,因为这样可以确保容器的运行环境符合预期。
2024-10-09 15:10:16
715
原创 Thread model: posix
在并行计算和多线程编程中,"Thread model" 指的是线程的创建、管理和同步的方式。"POSIX" 是 Portable Operating System Interface 的缩写,它是一个IEEE标准,定义了操作系统应该为应用程序提供的一系列接口,包括线程管理。它提供了一组API,允许程序创建和管理线程,以及进行线程间的同步。使用POSIX线程模型可以让程序员编写可移植的多线程应用程序,因为POSIX标准在多种操作系统上都有实现。在这个例子中,我们定义了一个简单的线程函数。
2024-09-10 16:12:39
381
原创 std::fixed
是一个 I/O 流操作符,用于设置浮点数的输出格式为固定小数点表示法,而不是科学计数法。这意味着当输出浮点数时,数值将按照指定的小数位数来显示,而不会以。这两个操作符会影响后续的输出操作,直到流格式被改变。如果你想将这些格式设置应用于文件输出,你可以将。)一起使用,以控制浮点数的输出格式。设置了小数点后显示两位数字。中,并且按照同样的格式设置。
2024-09-09 17:05:28
329
原创 iomanip库
是一个预处理器指令,用于引入 I/O 流操作库(Input/Output Manipulators Library)。这个库提供了一组操作符,可以用来控制输入输出流的格式,如设置浮点数的精度、调整输出字段的宽度、对齐方式等。首先以默认精度打印,然后以 4 位小数的精度打印。声明,以便可以直接使用这些操作符而不需要。打印时使用了不同的对齐方式和宽度。在 C++ 编程语言中,
2024-09-09 16:17:11
288
原创 csv文件
CSV 文件(Comma-Separated Values,逗号分隔值)是一种常用的文件格式,用于存储表格数据,如电子表格或数据库中的数据。CSV 文件以纯文本形式存储,其中的每一行代表数据表中的一行,而行中的每个字段通常由逗号分隔。CSV 文件由于其简单性和通用性,被广泛用于数据交换和备份。
2024-09-09 16:08:53
1324
原创 FLT_MAX
这意味着在单精度浮点数的表示范围内,任何大于这个值的数都将被视作无限大(infinity)。可以用来初始化变量,作为比较的基准,或者在算法中表示一个非常大的数。例如,如果你在寻找一组浮点数中的最大值,你可以将初始的最大值设置为。来访问,这是 C++ 标准库的一部分,它提供了对 C 标准库中浮点数限制的访问。可以帮助程序员处理浮点数的边界情况,避免因超出浮点数的表示范围而导致的溢出错误。在 C++ 中,这些值也可以通过包含头文件。,这样任何实际的数值都会比这个初始值小。中定义的一个宏,它表示单精度浮点数(
2024-09-09 15:57:06
392
原创 CMakeLists.txt 和 Makefile
和Makefile都是用于自动化编译和构建软件项目的配置文件,但它们在构建系统中扮演不同的角色,并且使用不同的构建工具。
2024-09-09 15:44:52
480
原创 Transiting from CUDA to HIP(三)
在 HIP (Heterogeneous-compute Interface for Portability) 中,为了提供一个统一的编程模型并简化开发过程,而不是提供两个独立的 API 集,HIP 通过引入新的模块(Modules)和上下文(Ctx)控制 API 来扩展其功能。例如,如果开发者在代码中混合使用了 HIP 运行时 API 和驱动 API,那么在某些情况下,HIP-Clang 可能会自动创建和销毁上下文,而开发者可能并不期望这种行为。你只需要选择一个设备,然后直接在这个设备上运行你的代码。
2024-09-04 18:10:16
1537
原创 Transiting from CUDA to HIP (二)
为了解决这个问题,HIP(Heterogeneous-compute Interface for Portability)提供了一套宏定义,使得开发者可以编写可移植的代码,这些代码可以在 NVIDIA 的 CUDA 平台和 AMD 的 ROCm 平台上运行。是一个预定义的宏,用于指示当前编译的代码所针对的 NVIDIA GPU 的计算能力(Compute Capability)。为了正确编译包含 HIP 代码的文件,您需要确保编译器能够找到 HIP 的头文件,并且定义了正确的宏。
2024-09-03 17:37:40
1743
1
原创 Debugging HIP
而在NVIDIA平台上,它返回的是CUDA运行时的版本号。追踪还可以显示与关键路径上意外调用昂贵 API 调用相关的性能问题(在性能上成本较高,可能是因为这些 API 调用涉及到大量的计算、内存使用、磁盘 I/O 或网络通信等,从而导致程序执行效率降低或响应时间延长)。在 GPU 编程中,内核(Kernel)排队序列化是一个重要的概念,它可以帮助开发者控制内核命令的执行顺序。这些环境变量主要用于调试和性能分析,它们可以强制 HIP 运行时在特定的点进行同步,从而帮助开发者诊断潜在的同步问题或性能瓶颈。
2024-08-29 10:10:09
1189
原创 HIP Logging
HIP(Heterogeneous-compute Interface for Portability)提供了一种日志记录机制,可以帮助追踪 HIP API 和运行时代码的执行情况。
2024-08-28 17:10:53
278
原创 ROCm Code Object Tooling
ROCm(Radeon Open Compute)提供了一系列的工具,用于检查和提取编译器生成的代码对象,包括可执行文件、目标文件和共享对象库。
2024-08-28 16:57:05
778
原创 Rocm-Programming with HIP 内存分配
使用 HIP Graph,开发者可以创建一个包含多个执行节点(如内核执行、内存复制等)的图形化任务依赖结构,然后提交给 GPU 执行,从而实现更细粒度的性能优化和资源管理。hipRTC 提供了一个灵活的方式来编译和执行 GPU 代码,允许在不同的运行时条件下进行优化,并且可以简化开发流程,因为不需要在编译时生成和处理二进制内核对象文件。提供了一种方式来分配可以被 GPU 直接访问的主机内存,这可以用于加速数据传输和实现零拷贝访问,但同时也需要考虑内存访问模式和数据一致性的需求。
2024-08-26 20:37:17
1519
1
原创 简述库文件
库文件是一种包含预先编译的代码、资源或数据的文件,它允许开发者在不同的程序中重复使用这些代码和资源,而无需每次都重新编写。库文件可以包含函数、类、变量、宏定义等,它们是软件开发中代码复用和模块化的关键组成部分。静态库(Static Library)通常以.lib(在Windows上)或.a(在Unix-like系统上)为文件扩展名。包含编译后的代码,但不是可执行的。在编译最终程序时,静态库中的代码会被复制到最终的可执行文件中。动态链接库(Dynamic Link Library,简称DLL)
2024-08-26 15:40:30
1316
原创 CUDA C权威编程指南 第4章 全局内存
对于程序员来说,一般有两种类型的存储器:· 可编程的:你需要显式地控制哪些数据存放在可编程内存中· 不可编程的:你不能决定数据的存放位置,程序将自动生成存放位置以获得良好的性能在CPU内存层次结构中,一级缓存和二级缓存都是不可编程的存储器。CUDA内存模型提出了多种可编程内存的类型:寄存器、共享内存、本地内存、常量内存、纹理内存、全局内存。一个核函数中的线程都有自己私有的本地内存。一个线程块有自己的共享内存,对同一线程块中所有线程都可见,其内容持续线程块的整个生命周期。所有线程都可以访问全局内存。
2024-06-18 20:48:14
991
原创 CUDA C编程权威指南 第3章 CUDA执行模型
CUDA编程模型中两个主要的抽象概念:内存层次结构和线程层次结构。它们能够控制大规模并行GPU。GPU架构是围绕一个流式多处理器(SM)的可扩展阵列搭建的。GPU中每一个SM都能支持数百个线程并发执行,每个GPU通常有多个SM,所以在一个GPU上并发执行数千个线程是可能的。当启动一个内核网格时,它的线程块被分布在了可用的SM上来执行。多个线程块可能会被分配到同一个SM上,而且是根据SM资源的可用性进行调度的。
2024-06-15 12:06:58
803
原创 C++ Primer 第五版 第16章 模板与泛型编程
一个函数模板(function template)就是一个公式,可用来生成针对特定类型的函数版本。模板定义以关键字template开始,后跟一个模板参数列表(template parameter list),这是一个逗号分隔的一个或多个模板参数的列表,用小于号(<)和大于号(>)包围起来。在模板定义中,模板参数列表不能为空。模板参数表示在类或函数定义中用到的类型或值。当使用模板时,我们(隐式地或显式地)指定模板实参(template argument),将其绑定到模板参数上。
2024-06-13 21:22:54
995
原创 C++ Primer 第五版 第15章 面向对象程序设计
面向对象程序设计(object-oriented programming)的核心思想是数据抽象、继承和动态绑定。通过使用数据抽象,我们可以将类的接口与实现分离;使用继承,可以定义相似的类型并对其相似关系建模;使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。任何构造函数之外的非静态函数都可以是虚函数。关键字virtual只能出现在类内部的声明语句之前而不能用于类外部的函数定义。如果基类把一个函数声明成虚函数,则该函数在派生类中隐式地也是虚函数。
2024-06-03 21:30:01
1099
原创 C++ prime 第五版 第14章 重载运算与类型转换
一、基本概念重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成。和其他函数一样,重载的运算符也包含返回类型、参数列表以及函数体。我们不能为内置类型的运算对象重定义运算符。对于一个运算符函数来说,它或者说类的成员,或者至少含有一个类类型的参数。直接调用一个重载的运算符函数某些运算符不应该被重载使用与内置类型一致的含义选择作为成员或者非成员二、输入和输出运算符IO标准库分别使用>>和<&
2024-05-26 14:35:27
343
原创 CUDA C变成权威指南 第二章 CUDA编程模型
CUDA6.0开始提出统一寻址(Unified Memory),它连接了主机内存和设备内存空间,可使用单个指针访问CPU和GPU内存。主机代码按照ANSI C标准进行编写,而设备代码使用CUDA C进行编写。一个典型的CUDA程序实现流程遵循以下模式。1. 把数据从CPU内存拷贝到GPU内存。2.调用核函数对存储在GPU内存中的数据进行操作。3.将数据从GPU内存传送回到CPU内存。
2024-05-22 21:46:16
669
1
原创 C++ Primer 第五版 第十三章 拷贝控制
在新标准下,我们可以通过将拷贝构造函数和拷贝赋值运算符定义为删除的函数(deleted function)来阻止拷贝。删除的函数是这样一种函数:我们虽然声明了它们,但不能以任何方式使用它们。在函数的参数列表后面加上=deleted来指出我们希望将它定义为删除的。=delete通知编译器(以及我们代码的读者),我们不希望定义这些成员。与=default不同,=delete必须出现在函数第一次声明的时候。
2024-05-22 12:05:50
1134
原创 C++ Primer 第五版 第12章 动态内存
定义一个名为StrBlob的类,保存一组元素。与容器不同,我们希望StrBlob对象的不同拷贝之间共享相同的元素。即,当我们拷贝一个StrBlob时,原StrBlob对象及其拷贝应该引用相同的底层元素。我们使用vector来保存元素。将vector保存在动态内存中,为每个StrBlob设置一个shared_ptr来管理动态分配的vector。次shared_ptr的成员将记录有多少个StrBlob共享相同的vector,并在vector的最后一个使用者销毁时释放vector。StrBlob构造函数。
2024-05-17 10:10:51
730
原创 CUDA C 编程权威指南 第一章 基于CUDA的异构并行计算
CUDA(Compute Unified Device Architecture, 统一计算设备架构)是NVIDIA提出的并行计算架构,主要用来处理密集型及并行计算。GPU和CPU是两个独立的处理器,通过单个计算节点中的PCI- Express总线相连,GPU用来提高计算密集型应用程序中并行程序段的执行速度,CPU则负责管理设备端的资源。
2024-05-14 21:05:15
1301
原创 C++ Primer 第五版 第十一章 关联容器
关联容器不支持顺序容器的位置相关的操作,例如push_front或push_back。关联容器也不支持构造函数或插入操作这些接受一个元素值和一个数量值的操作。关联容器的迭代器都是双向的。1. 定义关联容器每个关联容器都定义了一个默认构造函数,它创建一个指定类型的空容器。我们也可以将关联容器初始化为另一个同类型容器的拷贝,或者是从一个值范围来初始化关联容器,只要这些值可以转化为容器所需类型就可以。
2024-05-14 13:09:55
807
原创 C++ Primer 第五版 第十章 泛型算法
除了少数例外。标准库算法都对一个范围内的元素进行操作。我们将此元素范围称为“输入范围”。接受输入范围的算法总是使用前两个参数来表示此范围,两个参数分别是指向要处理的第一个元素和尾元素之后位置的迭代器。
2024-05-11 17:27:30
959
原创 C++ Primer 第五版 第九章 顺序容器
每个容器类型都定义了一个默认构造函数。除array之外,其他容器的默认构造函数都会创建一个指定类型的空容器,且都可以接受指定容器大小和元素初始值的参数。每个适配器都定义两个构造函数:默认构造函数创建一个空对象,接受一个容器的构造函数拷贝该容器来初始化适配器。默认情况下,stack和queue是基于deque实现的,priority_queue是在vector之上实现的。我们可以在创建一个适配器时将一个命名的顺序容器作为第二个类型参数,来重载默认容器类型。
2024-05-08 19:24:25
1123
原创 C++ Primer 第五版 第八章 IO库
如果本对象当前关联到一个输出流,则返回的就是指向这个流的指针,如果对象未关联到流,即返回空指针。当我们想要读写一个文件时,可以定义一个文件流对象,并将对象与文件关联起来。每个文件流都定义了一个名为open的成员函数,它完成一些系统相关的操作,来定位给定的文件,并视情况打开为读或写模式。iostream定义了用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型。此外,一些类,如string,通常也会定义类似的IO操作,来读写自己的对象。
2024-05-04 21:51:23
499
原创 C++ Primer 第五版 第七章 类
成员函数的声明必须在类的内部,它的定义可以在类的内部也可以在类的外部。定义在类内部的函数是隐式的inline函数。类外部定义的成员的名字必须包含它所属的类名:IO类型属于不能被拷贝的类型,因此我们只能通过引用来传递它们。聚合类(aggregate class)使得用户可以直接访问其成员,并且具有特殊的初始化语法形式。当一个类满足如下条件时,我们说它是聚合的:我们可以用一个花括号括起来的成员初始值列表初始化聚合类的数据成员,初始值的顺序必须与声明的顺序一致。静态成员独立于任何对象。
2024-05-04 15:46:19
736
原创 C++ Primer 第五版 第六章 函数
把函数声明放在头文件中,就能确保同一函数的所有声明保持一致。而且一旦我们想改变函数的接口,只需改变一条声明即可。定义函数的源文件应该把含有函数声明的头文件包含进去,编译器负责验证函数的定义和声明是否匹配。
2024-04-30 22:04:45
755
原创 C++ Primer第五版 第五章 语句
如果某个case标签匹配成功,将从该标签开始往后顺序执行所有case分支,除非程序显式地中断了这一过程(如break语句),否则知道switch的结尾处才会停下来。throw表达式包含关键字throw和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型。如果没有任何一个case标签能匹配上switch表达式的值,程序将执行紧跟在default标签后面的语句。,异常检测部分使用throw表达式来表示它遇到了无法处理的问题。,用于在throw表达式和相关的catch子句之间传递异常的具体信息。
2024-04-25 20:37:31
449
原创 C++ Primer第五版 第四章 表达式
注:对于多重赋值语句中的每一个对象,它的类型或者与右边对象的类型相同、或者可由右边对象的类型转换得到。pval的类型(int*)无法转换成ival的类型(int),所以尽管0这个值能赋给任何对象,但第一条赋值语句非法。其中,type是转换的目标类型而expression是要转换的值。reinterpret_cast通常为运算对象的位模式提供较低层次上的重新解释。位运算符作用于整数类型的运算对象,并把运算对象看成是二进制位的集合。sizeof运算符返回一条表达式或一个类型名字所占的字节数。
2024-04-23 12:32:00
223
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人