- 博客(23)
- 收藏
- 关注
原创 超算使用
作业提交后通常将排队一段时间,其输出如下:可以看出,作业确实运行在4个不同的节点上(打印了4个不同的IP地址),其中每个节点两个任务,每个任务都执行cn_ip_print.sh脚本。将作业脚本编写好之后提交给sbatch,即使交给sbatch的脚本没有添加执行权也能正常提交。作业脚本提交后,通过squeue可以看到当前账户已提交的作业的状态。PD表示pending,作业由于优先权不足而正在等待计算资源的分配。
2025-03-18 19:49:58
741
原创 在个人主机上使用Margo和Mercury
Margo是对Mercury的抽象和封装,如果客户端和服务器程序是直接调用Mercury来写的,那么由于这两个程序直接依赖于Mercury,因此在编译程序的时候记得更改链接的动态链接库。:最低级别,用于输出非常详细的调试信息。:最高级别,用于输出严重错误信息。:用于输出一般性的程序运行信息。:用于输出调试信息。:用于输出警告信息。:用于输出错误信息。
2025-01-03 19:59:58
374
原创 多进程使用信号量通信的框架
一定要先启动被动方,如果先启动主动方,会报错说信号量不存在,因为在本框架中信号量是由被动方创建的。对于sem_trywait() 而言,如果信号量当前可用,则获取它,如果不可用,则立即返回。当然,被动方也可以一直运行在后台,只需要取消调kill_sem就好。即使只有一个被动方在后台运行,也可以启动多个主动方,所有主动方都和这一个被动方通过信号量通信。在本框架中,信号量由被动方创建。首先启动被动方,被动方启动,成功创建信号量,之后再启动主动方,主动方只需要打开信号量即可和被动方通信。
2024-11-26 19:16:46
277
原创 实验:在个人主机上分配大内存
虽然我的物理内存总共都才只有16GB,但是进程在虚拟地址空间的堆上分配内存,只要虚拟地址空间的堆上还有内存,应该就可以成功分配。结合虚存技术,当物理内存不够时,就将脏页换出到磁盘上,将刷新后的干净的页面给进程用。结论:int类型能够存储的最大正整数为 2 * 1024 * 1024 * 1024 - 1,如果让int类型的变量存储2 * 1024 * 1024 * 1024,将会溢出为负数,导致传递给malloc的参数不合法。在一个进程中使用三次malloc,每次分配1GB内存,总共分配3GB。
2024-11-20 16:21:43
153
原创 行为探究:使用mmap将共享内存从内核映射到用户空间是直接映射吗?
使用shm_open()打开一个共享内存段。该接口的第一个参数是共享内存段的“路径名”。注意虽然该参数形式上是一个文件系统路径名,但实际上并不能像普通文件路径一样随意命名。
2024-11-15 16:39:16
303
原创 shell脚本语法
假设我有一个字符串:“OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022),”我想从中提取出两个捕获组,每个捕获组的内容都是3.0.2,我该怎么用正则表达式的 =~ 运算去匹配?:匹配任意字符(包括空格)零次或多次,这样可以连接两个捕获组之间的其他部分。这种语法进行正则表达式匹配时,Bash 会将匹配到的结果存储在。存储的是第二个捕获组匹配的内容,依此类推。存储的是第一个捕获组匹配的内容。存储的是整个匹配的字符串。
2024-11-12 20:59:25
276
原创 概念辨析:CPU、核心、线程、计算节点
8核CPU的处理能力往往比4核CPU高,而同样是8核,支持两个硬件线程的CPU,它的指令吞吐量往往比只支持单个硬件线程的CPU的大。并行编程要注意不同线程之间的耦合,如何不同线程耦合很紧,比如A线程总是要等待B线程的数据,那么即使是并行程序,性能可能也和串行时的差不多,甚至由于并行框架无法避免的一些开销,性能反而有下降。为了进一步提高CPU处理能力,于是人们想了另外的办法:单个CPU核心的频率有上限,但如果每个核心频率不是那么高,在一个CPU上集成多个核心, 让它们并行,不就行了吗?什么是CPU亲和性?
2024-11-11 19:56:35
487
原创 CMake构建工具
执行这个命令后,CMake 会读取源代码目录中的 CMakeLists.txt 文件,并生成相应的构建系统文件。这些文件可能是 Makefile(在 Unix 系统上)或 Visual Studio 项目文件(在 Windows 系统上),具体取决于 CMake 的配置和生成器的选择。是包含 CMakeLists.txt 文件的目录,这个文件定义了项目的构建过程、依赖项和其他配置。这样的命令用于生成构建系统文件,通常是在创建项目的构建目录时执行的。
2024-11-11 09:22:26
174
原创 如何使用VELOC
环境配置脚本(使用source命令执行):头文件位于install/include,库文件位于install/lib,服务器二进制可执行文件位于insatll/bin。
2024-11-08 09:35:20
230
原创 动态链接库与头文件包含
在编译和链接的过程中,动态链接库的使用确实有几个关键点需要注意。编译阶段:在这个阶段,源代码会被转换为目标代码(通常是.o文件)。这个过程中通常不需要链接动态库,因此不涉及。但是在编译时,如果你引用了动态链接库中的符号(例如,通过#include引入头文件并使用相应的函数),编译器需要知道如何找到这些符号的定义。这时,你需要在编译命令中指定库的路径,例如使用-L选项来指定库路径,以及-l选项来链接特定的库。链接阶段:在编译之后,链接器将目标文件与库进行链接。
2024-11-08 09:28:35
690
原创 C++文件接口行为探究
虽然问了大模型,大模型非说seekp和seekg是独立的,但是至少在我的主机上,实验结果表明对于fstream而言,这两个操作是绑定的。seekp改变写指针的时候同时改变读指针。
2024-11-05 20:56:09
111
原创 性能对比:基于内存的文件系统、基于SSD的文件系统、直接到用户空间缓冲区的数据拷贝
综上三方面因素,直接将数据拷贝到用户空间缓冲区是最快的,写入同等体量的数据,性能几乎是内存文件系统的22.2倍。内存的写入速度通常在几十GB/s的范围内,而即使是市场上最快速的高端SSD,其写入速度通常也不会超过5GB/s,然而在本实验中,文件系统基于内存时,它的性能仅为基于SSD时的大约两倍,并没有表现特别明显的优势。分别写入后端存储设备为物理内存的内存文件系统(/dev/shm)、后端存储设备为SSD的文件系统(/tmp),直接使用memcpy将数据拷贝到另一个用户空间的缓冲区。别说了,程序没写对。
2024-11-01 21:16:11
208
原创 红黑树与队列的性能对比:有序序列
对于一个具有2w条记录的有序序列,分别将它的元素插入红黑树和队列。使用队列这种数据结构时,性能几乎是红黑树的十倍。虽然C++的标准库没有直接支持红黑树,但是它的set容器是基于红黑树实现的,因此使用set来模拟红黑树。
2024-10-30 20:10:31
183
原创 主流HPC检查点库I/O行为总结
如何在应用程序中使用SCR?要点总结:1.每个检查点文件都有一个时间步与之对应,应用的一次运行会有很多个时间步,所以会有很多版本的检查点文件。2.最开始每个进程各自对应一个文件路径file,但是后面又调用了SCR_Rount_file(),对文件路径进行了路由,返回一个新的路径,可能在新的路径下能够有更好的读写性能,总之各个进程最终是通过路由后的路径写数据的。路由过程中发生了什么,仅通过接口看不来答案。3.看起来好像整个检查点阶段仅对文件进行一次写入,所有需要保存的数据都一次性写入。(怎么能够的。
2024-10-29 10:15:13
220
原创 UnifyFS安装笔记
输入文件:通常是或。输出文件:生成的可执行脚本名为configure。通过这些步骤,autoconf能够帮助软件开发者轻松处理不同系统环境带来的兼容性问题,实现更为自动化的构建过程。
2024-10-17 17:02:10
341
原创 探究多个MPI进程共享同一个文件的行为
使用该接口,可以将一个共享文件划分为多个不相重叠的区域,每个进程有一个rank,根据每个进程的rank计算出该进程负责哪个区域,这样,即使各个进程写文件的时间可能是乱序的不受控制的,但是每个进程写的位置却是固定的,因此最终得到的文件,其内容会符合预期。在MPI程序中,进程的秩是一个基本的概念,它贯穿于程序的整个执行过程中,对于程序的正确运行和性能优化都至关重要。:在某些情况下,进程的秩可以用于优化性能,例如,在数据划分时,可以选择将相邻的数据分配给相邻的进程,以减少通信开销。(2)为什么文件创建失败?
2024-07-30 14:04:13
1581
原创 GKFS源码阅读笔记:系统调用实现流程说明
在钩子函数中,判断文件路径是否为内部的,只是把路径和挂载目录作比对,如果路径名落在挂载目录下,那就判断为内部文件,然而,虽然这是一个合法的内部路径,但是它未必存在,所以还要调用adafs_metadata()从服务器上获取它的元数据,如果元数据存在,说明以前确实创建过这个路径,如果不存在,那么根据Linux-open()的语义,检查打开文件的时候指定的标志flags,看是否设置了O_CREATE,如果设置了,说明用户的意思是“如果文件不存在就创建这个文件”,所以,下一步调用adafs_mk_node()。
2024-07-02 16:43:25
314
原创 GKFS源码阅读笔记:客户端说明
应用程序运行前,先将环境变量LD_PRELOAD配置为客户端拦截库的路径,把拦截库预加载进内存,这样,程序运行过程中调用库时,首先调用的是拦截库里面的函数(是吗?每个客户端进程都有一个独立的预加载上下文PreloadContext,预加载上下文为单例模式,一个客户端从始至终只有一个,CTX就是定义的一个宏,用来获取预加载上下文的唯一实例。
2024-07-02 16:36:57
603
原创 GKFS源码阅读笔记:服务器说明
而trim_chunk_space()响应的是客户端的truncate()调用,这个调用的语义是截断一个文件的尾部,文件的尾部可能是多个块,分散在多个服务器上,使用哈希函数定位到这些目标服务器后,目标服务器执行trim_chunk_space(),因为文件的头部是要保留的,而一个目标服务器上的块,可能是头部块也可能是尾部块,所以不能像destroy_chunk_sapce()那样简单的无差别地删除,还需要做一个判断,遍历一个服务器上的所有块,看它是否落在尾部区间,是的话才删除,否的话则跳过。
2024-07-02 16:28:19
925
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人