Cpp 并行计算学习笔记
基本概念 首先学习几组基本概念: 并发(Concurrency)/并行(Parallelism) 同步(Synchronous)/异步(Asynchronous) 进程(Process)/线程(Thread) 并发 / 并行 并发指的是多个任务在同一时间段内被同时推进,可能是同时执行不同的任务,也可能是频繁交替执行每一个任务的一小部分 并行指的是多个任务在同一时间段内真正同时执行 举个例子: 学生在课后可以并发地完成每一个科目的作业:一会写语文作业,一会又切换回写数学作业,切换可以非常频繁,但是不可能同时写两科作业,也就是不能并行 人体的消化系统的任务和循环系统的任务在并行地执行:在同一时间内,肠道蠕动和血液循环在同时进行,不可能说心脏跳动时就让肠道蠕动暂停 同步 /...
GCC 源码编译安装(离线,普通用户)
gcc 的非 root 用户离线编译安装比其他的软件的源码安装都要复杂:因为它有依赖,在服务器上无法通过联网下载,要提前下载依赖的压缩包,而且gcc的编译时间很长。 安装过程主要参考CentOS7 离线升级安装gcc到6.3.0 和Linux 非root安装GCC9.1.0 下载依赖 在官网或者镜像网站下载 gcc-11.4.0.tar.gz,传到服务器上解压为~/tmp/gcc-11.4.0 进入~/tmp/gcc-11.4.0子目录,需要解决下载依赖的问题。在可以联网的情况下,直接执行自带的下载依赖的脚本 ./contrib/download_prerequisites。如果服务器无法联网,则需要手动下载处理 查看上述脚本,找到四个必要的依赖 gmp,mpfr,mpc,isl 以及对应的具体版本,例如...
FastFetch 小工具
介绍 FastFetch 是一款类似于 neofetch 的轻量级、快速的信息获取工具,可以在命令行中快速查看系统信息, 包括显示系统的硬件、软件和操作系统等关键信息,同时支持自定义输出格式。 安装 Windows上直接通过winget安装 1winget install fastfetch Ubuntu上可以通过包管理器安装 12sudo add-apt-repository ppa:zhangsongcui3371/fastfetchsudo apt install fastfetch 使用 直接通过 fastfetch 命令执行即可,效果例如
Cpp 小技巧/冷知识记录
记录一下C++的小坑/冷知识。 int8_t 输入 虽然C++提供了很多数据类型,但是最基础的其实还是有无符号的字符和整数浮点数等,其他的数据类型是对它们的简单包装,因此还是表现原本的行为,例如下面两种类型在msvc可能的定义为 12typedef signed char int8_ttypedef unsigned char uint8_t 这表明int8_t和uint8_t实际上还是char类型的重命名,这会影响很多地方的处理,例如cin在接收字符流输入时,会根据接收变量的数据类型进行转换:如果输入1,可能会被解释为ASCII字符1(值为49),也可能会被解释为整数1,这完全取决于接收变量的类型 1234567char a; cin >> a; // '1' = 49int b; cin >> b; // 1int8_t c; cin >> c; // '1' = 49uint8_t d; cin >> d; // '1' =...
Cpp 面向对象——成员函数中的 this
整理一下关于C++类的成员函数所拥有的特殊的this指针的知识,并且学习C++23中的新内容:显式推导this。 隐式this 基础 this指针是C++面向对象编程中的重要机制,在自定义类型的非静态成员函数中,都存在这一个自动传递的this指针指向当前对象自身,例如 12345678910111213#include <iostream>struct Test { int data = 0; void call() { std::cout << "call: " << data << "\n"; }};int main() { Test test{1}; test.call(); return 0;} 对于编译器来说,这里的定义和调用过程等效于下面的形式(因为this是关键词,在代码中使用this_来代表) 1234567891011121314#include...
Cpp 未定义行为
...
编程语言中的整除和取余
整除和取余是两个看起来非常简单明确的基本数学运算,但是在不同编程语言的实现中,其实存在着很多的差异,需要注意一下。 数论中的整除和取余 我们从这两个概念的数学定义出发,在数论中的整除和取余定义为:对于整数 \(a,b \in \mathbb{Z}\),其中 \(b \neq 0\),存在唯一的商 \(q\in \mathbb{Z}\) 和余数 \(r \in \mathbb{Z}\),使得 \[ a = b \,q + r \] 对于余数要求 \(0 \le r < b\),即余数是一个非负的且不超过除数的整数。 虽然初等数论主要关注的都是整数,通常不会涉及对实数的整除和取余运算,但是我们仍然可以直接将上述定义推广到实数中:对于实数 \(a,b \in \mathbb{R}\),其中 \(b \neq 0\),存在唯一的商 \(q\in \mathbb{Z}\) 和余数 \(r \in \mathbb{R}\),使得 \[ a = b \,q + r \] 对于余数要求 \(0 \le r...
编程语言中的整数和浮点数
整理一下编程语言中的整数和浮点数的相关内容,针对的情景是科学计算。 整数 整数模型 编程语言中的整数类型不同于数学意义上的整数,而只是它的一个有限子集,因为计算机为了计算效率,会使用固定的字节数来存储一个整数数据,例如 \(n\) 个字节,这意味这只有 \(2^{8n}\) 个不同状态,只能表示 $2^{8n} $ 个整数。 将 \(n\) 个字节所对应的 \(8n\) 比特的值依次记作 \(a_i \in \{0,1\}\),这里 \(i=0,\dots,8n-1\),那么通常有两类方案: 第一种方案是无符号整数,表示的值 \(V\) 为 \[ V = 2^0 a_0 + 2^1 a_1 + \dots + 2^{8n-2} a_{8n-2} + 2^{8n-1} a_{8n-1} \] 表示的范围为 \[ [0,2^{8n}-1] \] 第二种方案是有符号整数,表示的值 \(V\) 为 \[ V = 2^0 a_0 + 2^1 a_1 + \dots + 2^{8n-2} a_{8n-2} - 2^{8n-1} a_{8n-1} \] 表示的范围为...
C语言 weak弱符号(GCC扩展)
__attribute__((weak)) 是 GCC 和 Clang 提供的一个特性,用于声明一个符号为 "弱符号"(weak symbol),在链接层面提供更多的灵活性。注意并不是 C 语言标准的一部分,MSVC并不支持,但是提供了一个类似的特性:#pragma weak。 概述 编译器将一个符号(函数名,变量名)区分为强符号(strong symbol)和弱符号(weak symbol),通常绝大多数的符号都是强符号,重复出现会导致链接错误。在定义时使用 __attribute__((weak)) 可以将其设置为弱符号,语法如下(在符号声明时不需要) 1<符号类型> __attribute__((weak)) <符号名称>; 这可以使得它在链接过程中具有较低的优先级: 如果在链接过程中找到了同名的强符号和弱符号,弱符号会被强符号覆盖。 如果找到多个同名的强符号,会导致链接错误(link...
时间离散的潜在问题
概述 在数值求解ODE和PDE时,我们通常需要进行时空离散: 空间离散看起来就很麻烦:处理方式与具体的求解格式相关,但是都会涉及到网格剖分,网格加密,单元之间的数据交换,边界处理等; 时间离散看起来就很简单:只需要加上一层for或者while循环,最多加上时间步长的自适应调整即可。 但是就算是看起来非常简单的时间离散,在具体编程中也可能存在一些潜在的问题,下面先回顾一下几种最简单的时间离散情况,然后给出一个由格式和浮点数模型共同造成的最后时间步问题。 固定时间步数 固定时间步数是最简单的情况,在固定时间步数为 \(N\) 时,我们可以直接生成 \(N\) 次循环即可,例如 123456789const int N = 20;const double Tend = 1.0;double tnow = 0;double dt = Tend / N;for (int i = 0; i < N; ++i) { update(&data, tnow, dt); // from tnow to tnow+dt tnow = tnow +...