自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(142)
  • 收藏
  • 关注

原创 PDE的数值解法(有限元,有限差分法)综合介绍

以下内容均可参考本人知乎文章添加链接描述和添加链接描述有限差分法finite difference(FD)是求解微分方程的最为容易理解的方法,下面将针对几类常见的PDE来做一些具体的介绍。由于本人知识有限,关于误差分析和收敛性证明都不会介绍.一维例子我们以一个一维PDE的求解来介绍有限差分算法,这里给出精确解u^=x(1−x)exp⁡(x)\hat{u} = x(1-x)\exp(x)u^=x(1−x)exp(x).{−uxx=f,x∈(0,1),f=exp⁡(x)(−x2−x+1),u(0)=0,u(

2022-11-27 20:26:00 9335 2

原创 Linux安装anaconda和pytorch

anaconda安装这里我是使用课题组服务器,在服务器的/home/账户里安装anaconda。本人的安装环境:本人在登录节点安装,最终的结果送到计算 节点运行。1:首先要从网上下载anaconda.sh,这里大家登录anaconda官网寻找对应的版本链接:https://pan.baidu.com/s/1D0ooJFHvmz5ZIzqkIoXt2w提取码:hz3s上面是本人使用的sh文件,网盘自己取,这个生成的python版本是3.9,但是接下来我们要使用的pytorch对应的是3.8,读者自

2021-12-25 23:32:18 2709

原创 read me

关于该博客一开始是在2018年本人大三的时候,开始接触一些数值代数,微分方程数值解和学习matlab,那时候本人经常上网搜各种代码和算法,放到大作业里面,那时候经常接触CSDN博客,发现很多人的博客对于代码讳莫如深,不肯把自己完整的代码放出来供读者下载使用学习,当然了,这样有助于读者自己学习摸索,只不过这个过程有点太复杂,不同的人学习代码有不同的根基和领悟能力,像博主这样的人偏偏就是领悟能力差的,所以对这种行为非常不喜大三保研结束以后,人生轨迹有了新的方向,本来一直打算进军数学方向,纯粹是因为那时候对代

2021-12-15 11:34:45 2102 1

原创 寒武纪实现高维向量的softmax进阶优化和库函数对比

关于寒武纪编程可以参考本人之前的文章实验证明,axis=0和axis=-1的时候,手写softmax速度可以和库函数媲美,甚至于更甚一筹。

2024-07-01 16:05:39 70

原创 寒武纪显卡实现rmsNorm算子

rmsNorm算子的数学定义下面这个是针对一维向量的rmsNorm算子,对于高维向量,比如说形状为[A,B,C,D]的4维向量x,此时权重向量w长度默认为D,也就是说变换主要是针对axis=-1这个维度进行操作。关于寒武纪显卡的编程可以参考本人之前编写的文章添加链接描述和添加链接描述rmsNorm算子的实现思路由于寒武纪编程比较特殊,这里我们稍微复习一下寒武纪编程的特点:一张寒武纪显卡往往可以有8个或者4个cluster,其中一个cluster包含4个core,也就是说,对于4个cluster的显卡

2024-06-05 15:46:10 133

原创 flash attention的CUDA编程(一个线程处理多个元素)-V5

本文接着之前的文章介绍添加链接描述单线程处理多元素之前文章提到的算法都有一个特点,即一个(threadIdx.x,threadIdx.y)只计算输出O矩阵的一个元素,在内部循环计算matmul的时候也是如此,循环体内部的两个矩阵乘法也严格遵循了一个(threadIdx.x,threadIdx.y)计算输出矩阵的一个元素,但是在里面的matmul里面,为了计算一个输出,需要访问A,B矩阵的一行一列,这样就导致计算访存比非常小,为了加速内部的矩阵乘法,我们希望能够做出修改,一个线程同时计算多个元素,具体操作

2024-05-18 20:31:38 162 1

原创 flash attention的CUDA实现探讨-V4

之前关于flash attention的实现参考lash attention的数学变换:给定三个矩阵Q,K,V,形状都是[N,d],计算S=QK.T,然后针对dim=1做softmax,然后和V继续做矩阵乘法得到形状为[N,d]的输出矩阵O,即O=softmax(QK.T,dim=1)V。下面本人的实现以下图为基础,从下图也可以看出attention算法的关键在于对Q,K,V的分块,因此我们需要首先考虑清楚编程过程中一个线程块到底处理哪些数据。

2024-05-13 17:31:02 190

原创 C++搭建深度学习的推理框架

回顾pytorch里面搭建的全连接神经网络,我们以最简单的全连接神经网络举例子,这种神经网络涉及向量的传输,矩阵乘法计算,以及激活函数定义,其中的矩阵计算以及激活函数就可以理解为神经网络里面的算子。之前在上一篇文章添加链接描述我们介绍了CUDA版本的矩阵乘法,这里我们不妨以OpenMP为工具搭建一个CPU版本的矩阵乘法算子。

2024-04-07 17:06:56 227

原创 CMakeLists.txt编写简单介绍:CMakeLists.txt同时编译.cpp和.cu以及寒武纪kernel

关于CMakeLists.txt的相关介绍,这里不赘诉,本人的出发点是借助于CMakeLists.txt掌握基本的C++构建项目流程,下面是本人根据网络资料以及个人实践掌握的资料。

2024-04-02 18:16:20 902

原创 NCCL实现分布式矩阵乘法的CUDA代码

我们以矩阵乘法C=AB,其中A形状为[M,K],B形状为[K,N],C形状为[M,N]举例子,下面的分布式算法我们默认以MPI来切分数据,其中每个进程之前的数据都是私有,进程之间的数据交互使用通信来完成。A=(a0,0a0,1a0,2⋯a0,K−1a1,0a1,1a1,2⋯a1,K−1⋮⋮⋱⋮aM−2,0⋯aM−2,K−3aM−2,K−2aM−2,K−1aM−1,0aM−1,1⋯aM−1,K−2aM−1,K−1)\begin{equation} A=\left(\begin{array}{ccccc} a

2024-03-28 21:57:52 107

原创 寒武纪显卡实现高维向量的softmax并行优化

关于寒武纪编程可以参考本人之前的文章添加链接描述,添加链接描述,添加链接描述高维向量的softmax实现更加复杂,回忆之前在英伟达平台上实现高维向量的softmax函数,比如说我们以形状为[1,2,3,4,5,6]的6维向量举例,变换维度假设axis=2,之前英伟达平台的实现,我们计算出变换维度的长度dimsize=3,其他维度的乘积othersize=1×2×4×5×6 = 240,步长stride= 1×6×5×4 = 120,使用othersize=240个线程块,其中每个线程块处理对应一份数据,计算

2024-02-06 15:35:24 186

原创 寒武纪显卡实现softmax的pingpong流水并行

在上一篇文章中我们介绍了寒武纪显卡实现基本的softmax代码,这里我们借助于寒武纪的流水并行来编写进一步的策略。

2024-01-17 17:35:08 206

原创 寒武纪显卡实现softmax算子

寒武纪实现softmax包括下面5个步骤,我们也采取5个kernel来实现softmax:unionMaxKernel(float* middle, float* source1, int num),这个kernel使用的任务类型是union1,其中middle的长度为taskDim,达到的目的是middle对应元素存储的是不同taskId处理的那部分数据的局部max。

2024-01-10 17:49:23 525

原创 寒武纪bang的基础向量除法和规约编程

Queue是用来管理并行操作的一种方式。在同一个Queue中所下发的操作顺序是依次按照下发顺序执行的,在不同Queue中的执行操作则是乱序的。Queue所支持的操作不仅包括Kernel(在设备上的执行程序),还包括Notifier、内存拷贝、设备与主机的数据传输等一系列操作,所有需要按序执行的操作都可以下发至同一个Queue,Queue在当前操作满足执行条件后会依次按照进入顺序执行操作;而不同Queue的操作则不保证顺序,这些操作的顺序是无法预测的。

2024-01-10 16:54:01 559

原创 flash attention的CUDA编程进阶-V3

前面博客的实现逻辑是:以blockIdx.x作为矩阵Q的第i行输入,blockIdx.y × blockDim.y + threadIdx.y作为矩阵V的第j行输入,中间遍历矩阵K,V时使用for循环串行遍历。在for循环里面相当于每次只能获得QK.T的一个元素,我们的优化策略是以threadIdx.y来加速QK.T的矩阵乘法。这种做法的缺点是:如果N很大,d很小,那么会造成大量的线程浪费闲置,尤其是当d=1的时候,此时算法接近串行。

2023-11-19 10:44:13 445

原创 cublas,tensorcore矩阵乘法基本介绍

CαopAopBβCCαopAopB))βC,这里的运算符op决定是否转置。这里首先说明,cublasSgemm专门处理float类型的二维矩阵乘法,针对其他类型的矩阵,cublas有类似的函数接口cublasDgemm:处理double类型矩阵cublasCgemm:处理cuComplex类型矩阵cublasZgemm:处理cuDoubleComplex类型矩阵cublasHgemm:处理__half类型的矩阵。

2023-11-14 16:31:24 346

原创 softmax的高效CUDA编程和oneflow实现初步解析

本文参考了,其中oneflow实现softmax的CUDA编程源代码参考链接关于softmax的解读以及CUDA代码实现可以参考本人之前编写的几篇文章。

2023-10-31 09:19:27 451

原创 flash attention的重点解读和CUDA编程实现-V2

代码22行这里的i=blockIdx.x表示的输出矩阵的第i行,也是输入矩阵Q的第i行,代码23行的phd表示输出矩阵O的第phd列,也是输入矩阵V的第phd列。这两个索引在全过程不参与运算,只参与标记元素的位置。现在还剩下threadIdx.x没有派上用场,我们将利用threadIdx.x尝试遍历矩阵K的每一行,但是BLOCK_DIM_x是固定的,因此我们需要借助一个额外的循环来遍历K,因此phNumN就是总共要遍历的次数,这里一定要向上取整。

2023-09-26 16:28:52 1169

原创 flash attention的CUDA编程和二维线程块实现softmax-V1

本文参考了链接添加链接描述flash attention介绍flash attention的介绍可以参考论文:FlashAttention: Fast and Memory-Efficient Exact Attentionwith IO-Awareness,具体的数学公式参考下面这个图片:其中注意关于矩阵S有两个维度,softmax的操作维度是dim=1,用pytorch表示就是torch.softmax(S, dim=1)对于flash attention来说,里面有两次矩阵乘法,对于这样的二

2023-09-20 18:17:45 528

原创 softmax的cuda编程详细解读——算子融合

在上一篇博客我们介绍了softmax的内容以及相关的编程实现,总结一下softmax的特点如下:(没有特殊说明的情况下,考虑的仍然只是1D向量x1:获得向量的全局最大值M2:针对向量xexpxi​−Mi​求和得到S3:输出向量yxS从常理来看,我们至少需要发动3次kernel才能获得数值结果,但是这样非常耗时,有没有什么办法可以发动一次kernel就获得结果呢,下面不妨看看我们的分析过程。

2023-09-03 21:16:45 826

原创 expand,where和softmax算子的cuda编程

expand和where介绍当谈到 Torch 中的 expand 函数时,我们实际上是指 PyTorch(Torch 的 Python 接口)中的 expand 方法。下面是对 expand 方法和 where 函数的介绍,包括它们的输入和输出:expand 方法:torch.Tensor.expand() 是 PyTorch 中 Tensor 类的一个方法,用于扩展张量的维度。输入:input 是要扩展的张量,size 是一个元组,指定了要扩展的每个维度的大小。输出:返回一个新的张量,形状是

2023-08-31 20:10:46 471

原创 数学系硕士研究生的科研过程——PDE约束下含参优化控制问题的深度学习算法

笔者今天上午收到了之前北大课题组老板的通知,得知研究生期间和学长合作的论文终于被siam接收,终于为自己研究生涯画上了一个句号。这里打算分享一下个人的科研过程以及这篇论文的工作,即将读研或者打算读研的同学或许可以从中获得益处。论文今天被接收,距离见刊尚有一段时间,因此这里只能提供arxiv上的论文链接。

2023-08-28 18:01:13 642 8

原创 多重网格算法的cuda编程

这里写自定义目录标题多重网格算法介绍问题描述——五点差分法求解二维泊松方程五点差分法Gauss迭代算法限制算子介绍提升算子二重网格算法多重网格算法多重网格cuda代码编写串行代码mg.c两重网格cuda并行代码jacobi迭代的cuda编程device_jacobiMakefilecuda_mg.cucuda_mg.hmain.c多重网格算法介绍问题描述——五点差分法求解二维泊松方程{−Δu=f, in Ω,u=g, on ∂Ω,\left\{\begin{al

2023-08-08 16:58:42 424

原创 torch.nn.DataParallel实现深度学习求解PDE数据并行

泊松方程{−Δu=f, in Ω,u=g, on ∂Ω,\left\{\begin{aligned} -\Delta u &=f, \text { in } \Omega, \\ u &= g ,\text { on }\partial \Omega,\\ \end{aligned}\right.{−Δuu​=f, in Ω,=g, on ∂Ω,​这里我们选取

2023-08-02 13:31:47 597

原创 深度学习求解稀疏最优控制问题的并行化算法

稀疏最优控制问题问题改编自论文An FE-Inexact Heterogeneous ADMM for Elliptic Optimal Control Problems with L1-Control Cost{min⁡y(μ),u(μ)J(y(μ),u(μ))=12∥y(μ)−yd(μ)∥L2(Ω)2+α2∥u(μ)∥L2(Ω)2+μ∥u(μ)∥L1, subject to {−Δy(μ)=u(μ)+f(μ), in Ω(μ),y(μ)=0,&nbs

2023-05-29 15:03:57 741

原创 mpi4py结合pytorch求解稀疏椭圆优化控制问题

稀疏椭圆优化控制问题{min⁡y(μ),u(μ)J(y(μ),u(μ);μ):=12∥y(μ)−yd∥L2(Ω)2+α2∥u(μ)∥L2(Ω)2+μ∥u(μ)∥L1(Ω), subject to {−Δy(μ)+y(μ)3=u(μ) in Ω,y(μ)=0 on ∂Ω,andua≤u(μ)≤ub a.e. in Ω.\left\{\begin{aligned} &\min_{y(\bold

2023-05-29 15:03:29 1148

原创 pytorch实现导热率优化控制问题的并行算法

问题来源于论文Reduced Basis Methods—An Application to Variational Discretization of Parametrized Elliptic Optimal Control Problems问题描述{min⁡y(μ),u(μ)J(y(μ),u(μ))=12∥y(μ)−yd∥L2(Ω)2+α2∥u(μ)∥L2(Ω)2, subject to {−∇⋅(a(μ)⋅∇y(μ))=u(μ), in Ω,y(

2023-05-29 15:01:42 769

原创 mpi4py结合pytorch求解多重参数最优控制问题

多重参数最优控制问题问题改编自论文Fast PDE-constrained optimization via self-supervised operator learningmin⁡12∥y(μ)−yd(μ)∥L2(Ω)2+α(μ)2∥u(μ)∥L2(Ω)2+β(μ)∥u(μ)∥L1\min \frac{1}{2}\left\|y(\boldsymbol{\mu})- y_{d}(\boldsymbol{\mu})\right\|_{L_{2}\left(\Omega\right)}^{2}+\fra

2023-05-29 15:01:08 705

原创 mpi4py和pytorch求解含参优化控制问题-几何参数

含参优化控制问题数学模型下面三行代码分别表示:代码运行,–para 2表示选择第二种并行策略查看运行情况杀死命令nohup mpiexec -n 8 python hpann.py --para 2 >> hmpi.log 2>&1 &ps -ef | grep pythonps -ef | grep python | awk '{print $2}' | xargs -n 1 kill -9OCP(μ):{min⁡(y(x,μ),u(x,μ))∈Y×UQ

2023-05-29 15:00:20 650

原创 direct-adjoint-looping结合五点差分法求解含参优化控制问题

含参优化控制问题描述{min⁡(y(x,μ),u(x,μ))∈Y×UQ(y(x,μ),u(x,μ))+β(x,μ)j(u(x,μ)), s.t. u(x,μ)∈Uad(μ)={v:ua(μ)≤v≤ub(μ)}⊂U,\left\{\begin{aligned} &\min _{(y(\mathbf{x}, \boldsymbol{\mu}), u(\mathbf{x}, \boldsymbol{\mu})) \in Y \times U} Q(y(\mathbf{x},

2023-05-29 14:57:29 1053

原创 多重网格算法求解二维泊松方程的python实现

问题描述二维泊松方程{−Δu=f, in Ω,u=g, on ∂Ω,\left\{\begin{aligned} -\Delta u &=f, \text { in } \Omega, \\ u &= g ,\text { on }\partial \Omega,\\ \end{aligned}\right.{−Δuu​=f, in Ω,=g, on ∂Ω,​

2023-05-14 20:19:31 841

原创 深度ritz方法求解高维泊松方程

此时样本数目过于庞大,一定会导致训练特别耗时。为此可以采取的策略是,每训练一定次数,就重新撒点,对于边界点也是类似的。举例子,如果我们在区域内部采集1000个样本点,扩散到每个维度,那么每个维度最多采集了2个点,因为。,这样导致样本数目过小,如果一开始每个维度采集20个点,那么需要采集的样本数目就是。长度因子需要满足在边界上取值为0,在内部区域恒大于0.,利用netg训练边界数据,构建均方误差函数,训练完以后netg满足。表示区域维度,这里我们使用PFNN算法来求解这个问题。即可,这个思想非常简单。

2023-05-03 10:10:33 1060

原创 深度学习求解一维burgers方程和Galerkin求解泊松方程

{ut+uux−(0.01/π)uxx=0,x∈[−1,1],t∈[0,0.99],u(0,x)=−sin⁡(πx),u(t,−1)=u(t,1)=0.\left\{\begin{array}{l}u_t+u u_x-(0.01 / \pi) u_{x x}=0, \quad x \in[-1,1], \quad t \in[0,0.99], \\ u(0, x)=-\sin (\pi x), \\ u(t,-1)=u(t, 1)=0 .\end{array}\right.⎩⎨⎧​ut​+uux​−(0.0

2023-04-09 09:51:42 1357

原创 PDE的mpi4py深度学习区域分解并行算法-NS方程和泊松方程

−Δuu​finΩgon∂Ω​这里我们选取Ω012。

2023-03-21 21:26:10 705 4

原创 偏微分方程约束下的优化控制问题(PDE-constrained optimal control problems)

{min⁡(y(x),u(x))∈Y×UJ(y(x),u(x)), s.t. F(y(x),u(x))=0 in Ω, and u(x)∈Uad,\left\{\begin{aligned} &\min _{(y(\mathbf{x}), u(\mathbf{x})) \in Y \times U} J(y(\mathbf{x}), u(\mathbf{x}) ),\\ &\text { s.t. } \ \mathbf{F}(y(\mathbf{x}),u(\mathbf{x

2023-02-08 18:41:17 1155

原创 PDE约束优化控制问题求解-间断问题

min⁡y,uJ(y,u)=∫Ω(y−yΩ)2dxdy s.t. −Δy=u+eΩ,x∈Ω,y=0,x∈∂Ω.−1≤u≤1.\begin{array}{cl} \min _{y,u} & J(y,u) = \int_{\Omega} (y - y_{\Omega})^2 dx dy \\ \text { s.t. } & - \Delta y = u + e_{\Omega},\mathbf{x} \in \Omega, \\{ }&y = 0, \math

2023-02-07 11:23:50 535

原创 cuda编程的规约策略-MINRES算法的进阶优化

1:Error: CUDA driver version is insufficient for CUDA runtime version,这个问题一般是任务在登录节点运行出现的,如果放到计算节点(slurm提交)就会消失。2:__global__开头的函数没有被GPU调用,这种情况可能是slurm文件有问题,比如说没有指定分区gpu(许多人直接拿openmp的slurm用,但是openmp指定分区cpu)。3:所有代码都正确,但是结果有问题,经过考察发现这种问题一般是设置的blockdim=(NX,N

2023-01-19 20:42:02 683

原创 含参优化控制问题的神经网络算法和并行优化

注意,下面代码的bfgs库是我们自己编写的优化库,可以注释掉,使用torch自带的LBFGS库代替优化器部分。OCP(μ):{min⁡(y(x,μ),u(x,μ))∈Y×UJ(y(x,μ),u(x,μ);μ), s.t. F(y(x,μ),u(x,μ);μ)=0 in Ω(μ), and u(x,μ)∈Uad(μ),\mathrm{OCP}(\boldsymbol{\mu}):\\\quad \left\{\begin{aligned} &\min _{(y(\mathbf{x},

2023-01-04 16:44:00 68

原创 稀疏矩阵向量乘法的openmp并行优化

添加链接描述本人在这篇博客已经介绍过稀疏矩阵向量乘法以及相关的一些存储方式,这里重点开始介绍openmp的并行优化。下面这个图片就是采用CSR格式读取稀疏矩阵向量乘法的主体架构,全称为Compressed Sparse Row Matrix压缩稀疏矩阵行格式,该格式对矩阵进行行压缩,通过row_ptr,col_ind,values来确定矩阵。对于第i行来说,该行非零元素的列索引存储在col_ind[row_ptr[i]:row_ptr[i + 1]]中,该行非零元素值存储在values[row_ptr[i

2023-01-02 13:49:57 759

原创 含参PDE(偏微分方程)的神经网络并行编程区域分解mpi4py

−Δu=f,x∈Ω=(0,1)2−Δu=f,x∈Ω=(0,1)2u=g,x∈∂Ωu=g,x∈∂Ωu=exp⁡(−(x−a)2+(y−b)22l2),a,b,lu=exp(−2l2(x−a)2+(y−b)2​),a,b,l是参数,其中a∈[0,1],b∈[0,1],l∈。

2022-12-14 12:05:18 624

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除