C++ - Pthread 学习记录
什么是 PthreadPOSIX线程,英语:POSIX Threads,常被缩写为 Pthreads ,是 POSIX 的线程标准,定义了创建和操纵线程的一套 API
实现POSIX 线程标准的库常被称作 Pthreads ,一般用于 Unix-likePOSIX 系统,如 Linux、Solaris。但是 Microsoft Windows 上的实现也存在,例如直接使用 Windows API 实现的第三方库 pthreads-w32 ,而利用 Windows 的 SFU/SUA 子系统,则可以使用微软提供的一部分原生 POSIX API
Pthreads 定义了一套C语言的类型、函数与常量,它以 pthread.h 头文件和一个线程库实现
Pthreads API 中大致共有 100 个函数调用,全都以 “pthread_” 开头,并可以分为四类:
线程管理,例如创建线程,等待(join)线程,查询线程状态等。
互斥锁(Mutex):创建、摧毁、锁定、解锁、设置属性等操作
条件变量(Condition Variable):创建、摧毁、等待、通知、设置与查询属性等操作
使 ...
C++ - OpenMP 学习记录
什么是 OpenMP
简易、快捷、高校、跨平台的线程 API 库 —— Tokisakix
进程和线程进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。线程:是进程的一个执行单元,是进程内的调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。上面的解释可能还是有些抽象,但是通俗地解释方式就是:线程是进程的一个单元,如果把进程比作一座工厂,线程类似于工厂中的工人这个比喻引用于此链接(点击跳转),可以在这里了解更多详细知识
共享内存的线程模型共享内存的线程模型是指:
每个线程都可以有局部数据,也有共享的全局变量。多个线程共享相同的地址空间,每个线程都能访问全局内存。线程的栈被分配在堆区,但只有主线程的栈可以动态增长,而子线程的栈是固定的。线程之间的通信依靠共享的内存实现。
OpenMP 是什么?OpenMP 是一套支持跨平台的共享内存方式的多线程并发的编程 API
可以理解为,OpenMP 就是一套可以插入在代码中的工具,我们利用这些工具来实现一些多线程相关的功能。
OpenMP 基于 Fork 、Join 模型,如下 ...
C++ - MPI 学习记录
什么是 MPIMPI 全名叫 Message Passing Interface,即信息传递接口,作用是可以通过 MPI 可以在不同进程间传递消息,从而可以并行地处理任务,即进行并行计算。需要注意的是,尽管我们偶尔会说使用 MPI 编写了某某可执行程序,但是 MPI 其实只是一个库,而不是一种语言,其可以被 Fortran、C、C++、Python 调用
说到并行,为了避免在概念上混淆,那我们又不得不再提一下串行、并发、同步、异步这几个容易混淆的概念
串行:指的是在执行多个任务时,各个任务按顺序执行,完成一个后才能进行下一个
并行:指的是多个任务可以同时执行
并发:并发编程又叫多线程编程,指的是在执行多个任务时,因为资源不够所以采用一个 CPU 轮换着进行这些任务,从而提高任务效率,因为切换任务的速度很快,所以看上去是多个任务一起进行
同步:同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。例如消息发送方必须等待消息接收方接受完才能继续执行后续任务
异步:异步就是彼此独立,在等待某件事的过程中继续做自己的事。例如消息发送方再发送完一条消息后不必等待接收方的接收即可继续执行 ...
过往一年学习的感悟
一些过往半年学习的感悟敬爱的邢老师:
您好!
老师,自上次三四月份之后已经有半年没见了,上次见面时我们聊起人工智能,您说:目前我对人工智能的理解也不算很多,回头还需要多去学习了解。返校后的这半年,我看了一些国际内外很出名的人工智能教材、了解并动手实现了很多经典的人工智能模型、翻阅过两三篇有划时代意义的人工智能论文。过往半年我有机会跟广东省气象局还有我们学校的一些科研研究室有过交流,这让我对当下人工智能从理论概念走入实际应用有了更多的认识。在此有一些经历与看法想要与您分享。
首先我想向老师您按我现在的认识介绍一下人工智能,当下的人工智能其实就是一个复杂的数学运算机器,不同的人工智能模型有不同的计算方式,但有一点是完全相同的 —— 输入和输出都只能是数字。目前我们能了解到的人工智能可能会涉及到图片、音频、文字……的处理其实本质上都是对数字的处理。计算机用数字来表示像素,一张图片可以被拆分成很多的像素点,所以图片可以用数字表示;音频也可以用数字来表示波形;文字也可以用数字来做映射表示。当我们把需要处理的媒介全部转换成数字后,人工智能模型就可以对这些数字做数学计算,最后得到输出。
人工智能模型 ...
k8s - 在 CentOS7 虚拟机上部署 k8s 集群
环境准备本文服务器的公网IP:192.168.56.101本文一共使用三台 CentOS7 虚拟机
OS version: CentOS 7
CPU Architecture: x86_64/amd64
K8s version: v1.23.17
Docker version: 20.10.23
CentOS7 虚拟机配置网络
先检查是否开启了网络
12ping bilibili.comip addr show
设置网关 修改对应配置文件里的内容 ONBOOT=yes
123cd /etc/sysconfig/network-scriptsvi ipcfg-enp0s3vi ipcfg-enp0s8
配置 DNS 先修改主机名
123hostnamectl set-hostname k8s-masterhostnamectl set-hostname k8s-node1hostnamectl set-hostname k8s-node2
修改 DNS 里的映射关系
12345cat >/etc/hosts <<EOF ...
Rust - Rustlings Write Up
写在前面最近学长推荐我去学一下 Rust,考虑了一下,决定从 Rust 官方的学习文档 —— 也就是 Rustlings 入手,我一共用了两天的时间来完成 Rustlings,下面是我的题解(截至 2023.9.2)
Rust 给我的感觉就是生态好,打包方便,有便捷的包管理器;但是 Rust 的语法是非常严苛,通过严格的语法规范来减少程序运行时内存错误的发生
Rustlingsintrointro1.rs1234567891011121314151617181920212223242526272829303132333435363738394041// intro1.rs//// About this `I AM NOT DONE` thing:// We sometimes encourage you to keep trying things on a given exercise, even// after you already figured it out. If you got everything working and feel// ready for the next ...
OS - 16-bit 操作系统 TKSKOS 诞生记
写在前面此时此刻,2023 年 8 月 29 日,我一个人坐在中山大学南实验楼 D502 Matrix 实验室里
在我高中还不知天高地厚的时候,我曾荒诞地认为微软开发的 Windows 系统不过如此;而自我步入大学生活以来,真正地接触过计算机技术后,才愈发感受到面前这七八十年计算机大厦的坚不可摧和绝对统治。我尝试追逐前人的步伐,用 C++ 实现一个操作系统便是其中的一步
寒假时期我便已读完了 《深入理解计算机系统》 ,又称 CSAPP ,这是一本神书!我在 CSAPP 里学到了汇编、CPU 原理等一大堆很重要的前置概念。再然后,我翻阅到我的一位学长 —— GZTime 他用 Rust 实现 GGOS 的纪念博客,我逐渐有了用编写属于自己的操作系统的企划,并且大致敲定了是用 C++ 来完成,命名为 TKSKOS 。2023 年 4 月,因为一些意外我的生活天翻地覆;某一天的高等数学课,我无聊时翻阅知乎,意外地翻到一篇中大学姐的亲手实现操作系统的记录 —— 这对我影响很深,那段时间我满脑子都是一个全新的企划。紧接着我入手了一本 《操作系统概念》 ,开始阅读里面的知识,从进程调度一直到虚拟内 ...
Pytorch - 基于循环神经网络的正弦函数预测模型训练与检测
小白劝退预告
仅简单介绍思路,没有用作教程的打算,如果读者没有机器学习基础、循环神经网络基础或Pytorch基础 —— 会很不友好的(
Pytorch实现神经网络Pytorch 准备正弦函数数据集其中超参数的含义如下:1. input_size: 输入预测的特征值数目2. output_size: 最终输出的预测数值数目3. hidden_size: 循环神经元的特征数目4. batch_size: 一次训练批量数目5. num_hidden: 循环层神经元的层数6. length_num: 数据集的数据数目
12345678910111213141516input_size = 1output_size = 1hidden_size = 16batch_size = 49num_hidden = 1length_num = 50X = torch.linspace(0, 10, length_num)Y = torch.sin(X)plt.scatter(X, Y)plt.show()data0_48 = Y[0:49].reshape(num_hidden, batch_s ...
现代深度卷积神经网络架构的代码实现
小白劝退预告
仅简单介绍思路,没有用作教程的打算,如果读者没有深度学习基础、计算机视觉基础、Pytorch基础 —— 会很不友好的(
前置准备我们先准备好对应的第三方模块包和使用函数
1234567import torchfrom torch import nn, optimimport torch.nn.functional as Ffrom torchvision import datasets, transformsfrom torch.utils.data import DataLoaderimport matplotlib.pyplot as pltfrom time import perf_counter
我们先写好一个展示神经网络结构并输出张量形状的函数showModel 通过递归调用,将所有 Sequential 类展开,并以此输出各层的张量大小showNet 通过输入模型,并指定张量的大小,实现了测试函数的封装
1234567891011121314def showModel(model, inputs): for layer in model: ...
AI-Web-APP - 基于卷积神经网络和Flask框架开发一个手写数字识别的Web应用
小白劝退预告
仅简单介绍思路,没有用作教程的打算,如果读者没有深度学习基础、计算机视觉基础、Pytorch基础、前后端基础和Flask基础 —— 会很不友好的(
项目架构一个手写数字识别的Web应用可以分为以下几个部分:
神经网络:一个输入 (28, 28) 的矩阵后得到一个输出的神经网络,用于识别矩阵对应的数字
前端页面:为用户提供可交互的界面,与用户发生交互,并将对应的手写图片发送给后端
后端处理:接收前端提供的手写图片,并对手写图片进行矩阵化处理,经过神经网络识别后将结果发送给前端
在本项目中,主要用到以下的技术栈:
Pytorch 实现并训练的神经网络,通过 CUDA 加速计算
使用 Pytorch-MNIST 数据集
用 Flask 来构建后端,通过 OpenCV-Python 来预处理图片数据
原生前端,通过 JavaScript 的 Ajax 请求来与后端交换数据
神经网络识别数字的过程交给神经网络来操作
训练神经网络一个简单的卷积神经网络模型,先进行三次卷积操作,最后通过全连接到十个输出,分别对应数字 0 - 9 的的概率比重神经网络结构如下: ...