CUDA学习笔记——入门例子
虽然配置CUDA的目的主要是支持PyTorch的机器学习,但是如果需要直接手写CUDA代码,并在Windows上使用nvcc顺利编译和执行纯CUDA程序,还需要Visual
Studio相关工具的支持。(MINGW似乎不太行,或者说鼓捣起来太麻烦,Windows中的nvcc默认是配合MSVC进行编译的)
鉴于我在电脑上安装了VS2022,并且CUDA自动给VS2022加了插件适配,因此尝试学一点CUDA,并写几个简单的HelloWorld程序。
基本概念
CUDA编程模型是一个异构模型,需要CPU和GPU协同工作,通常CPU负责处理逻辑复杂的串行程序,而GPU重点处理数据密集型的并行计算程序,从而发挥最大功效。
在CUDA中,用host指代CPU及其内存,用device指代GPU及其内存。CUDA程序中既包含host程序,又包含device程序,它们分别在CPU和GPU上运行。
host与device之间可以进行通信,在它们之间需要进行数据拷贝。
一个典型的CUDA程序的执行流程如下:
分配host内存,并进行数据初始化;
分配device内存,并从host将数据拷贝到device上 ...
CUDA学习笔记——基本概念与配置
基础概念
显卡/显卡驱动
显卡(Video card,Graphics
card)全称显示接口卡,又称显示适配器,是计算机最基本配置、最重要的配件之一,由GPU、显存等组成。(与之类似的概念还有网卡,声卡等)显卡是电脑进行数模信号转换的设备,承担输出显示图形的任务。具体来说,
显卡负责将电脑的数字信号转换成模拟信号让显示器显示出来。
早期显卡一般都是集成在主板上,只完成最基本的信号输出工作,并不用来处理数据。后续发展才出现了独立显卡,显卡因此分为了独立显卡和集成显卡。集成显卡是指集成在主板上,因此不能随意更换。而独立显卡是作为一个独立的器件插在主板的AGP接口上的,可以随时更换升级。另外,集成显卡使用物理内存,而独立显卡有自己的显存。一般而言,同期推出的独立显卡的性能和速度要比集成显卡好、快。目前主流的游戏笔记本通常都配有一个集成显卡和一个独立显卡,轻薄笔记本则可能只有一个集成显卡。
显卡是硬件设备,必须在电脑的软件层面安装对应的显卡驱动,显卡驱动需要正确地与特定型号的显卡硬件匹配才能正常工作。制造商会为每款显卡发布相应的驱动程序。如果没有安装正确的驱动程序,操作系统可能无法识别显卡, ...
WSL2 安装记录
首先注意WSL1 和 WSL2 是不同的产品:
WSL1 是在Windows之上加了一个转换层,用来支持基本的Linux环境;
WSL2
则是更完整的虚拟化,包括一个定制的Linux内核,支持更完整的Linux使用。
虽然WSL2在某些情境下因为虚拟化程度更高而导致效率比WSL1更低,例如跨系统的文件读写,但是这相比与WSL2的巨大优势可以忽略不计,目前只推荐安装和使用WSL2。
需要注意的是,虽然都是基于虚拟化技术,WSL2和普通的虚拟机还是有很多不同之处:
虚拟机是完全隔离在一个沙盒中,操作很难影响到外层的实体机,除非使用虚拟机软件提供的共享目录等,因此操作更加安全。
WSL2则更像一种“共生”关系,Windows的硬盘也被自动挂载在WSL2的目录下,因此rm -rf /*这种危险操作在损害WSL2的同时也会直接损坏Windows!!!
准备
首先确保CPU虚拟化开启,默认似乎就是开启的,查看CPU就可以看到,确认一下。
然后在搜索栏中搜索启用或关闭Windows功能,往下翻找到适用于Linux的Windows子系统和虚拟机平台,单击确定,等待安装完成后重启。
顺便把Hyp ...
Hexo 博客部署与重建记录
我已经记不得这是第几次重建博客了,虽然基于git仓库的备份,所有的md文件都还在,但是node_modules以及其他的环境配置会因为各种各样的原因损坏(换电脑,系统重装,迁移系统等),有必要重新梳理一下博客搭建的过程。
下面的内容主要是在Windows上和linux(WSL2)上的本地部署,以及在云服务器和Github
Page的远程部署,并不涉及具体的Hexo主题以及配置细节。
生成与部署逻辑
Hexo是一个基于NodeJS的静态博客框架。首先梳理一下主要的工作逻辑:
在本地博客文件夹中,下载必要的Hexo组件并配置
在source\_posts目录中添加博客文件(markdown格式)
生成并推送
执行hexo generate生成相应的静态网页,生成的静态网页及相关资源都会存放在public\目录下
执行hexo deploy部署到远程仓库,实质上是将public\目录下的所有内容打包复制到一个git本地仓库,然后提交到指定的远程仓库
本地预览:执行hexo server启动本地预览,Hexo会在本地部署一个网站,通过http://localhost:4000访问。在本地 ...
LaTeX Beamer 笔记
系统地整理一下Beamer的笔记,之前的使用只是基于某个模板的临时使用,当前的目标是整理一个简洁的自用Beamer模板。
注意到Beamer虽然属于LaTeX的一部分,但是与标准的LaTeX文档有很多的不同,部分LaTeX宏包和命令可能无法在Beamer上呈现正常的效果,这也意味着Beamer的编译错误更难改正。
笔记主要参考latex-beamer.com的英文在线教程和若干博客。
当前模板的效果如下图,模板对应的配置代码在本文最后。
极简示例
从一个最简单的例子开始 1234567891011121314151617181920212223\documentclass{beamer}% Theme choice:\usetheme{AnnArbor}% Title page details:\title{My First \LaTeX{} Presentation}\subtitle{A subtitle}\author{Fenglielie}\date ...
LaTeX 算法与代码环境
算法环境 algorithm2e
介绍
在LaTeX中使用伪代码来描述算法是常见的需求,LaTeX其实有很多类似名称的宏包,简单辨析一下:(参考latex 中
algorithm、algorithmic、algorithmicx、algorithm2e 的区别)
algorithm
用来封装算法:给算法加上标题(caption)和标签(label),方便进行索引;
algorithmic 相当于算法的内容物;
algorithmicx 相当于 algorithmic
的升级版;
algpseudocode 是 algorithmicx
的一种呈现方式,完整包含了algorithmicx;
algorithm2e 和
algorithmicx、algorithmic
类似,也是用来描述算法的;但是其语法不如 algorithmicx
直白。
总得来说,通常有两条路线可以选择:
用algorithm2e宏包搞定
用algpseudocode或algorithmic等撰写算法本身,再用algorithm包给算法加标题
本文主要考虑第一个方式——使用algorithm2e宏包。
在导入 ...
VSCode LaTeX WorkShop 配置
基础概念
LaTeX WorkShop
插件的编译逻辑分为两层:第一层为recipe,第二层为tool,具有如下特点:
一个recipe由若干个tool组成;
在配置文件中可以提供多个recipe和多个tool;
直接点击编译按钮会自动选择第一个(或上一次使用的)recipe来执行编译;
一个tool通常包括一个单独的编译命令加上若干参数,例如xelatex,lualatex和pdflatex等,还可能是处理参考文献需要的bibtex或biber;
一个recipe会依次执行它所包含的tool,例如: 1xelatex -> bibtex -> xelatex -> xelatex
下文中编译命令及其选项可以参考其它几篇关于LaTeX的笔记,LaTeX WorkShop
插件只是对这些编译命令进行了封装。 此外,LaTeX WorkShop
插件会在命令中传递特殊变量%DOC%或%DOCFILE%代表当前文件,第一个只是文件名不含后缀,第二个则是文件名加上完整路径,略有区别。
由于插件也只是调用了pdflatex、latexmk等编译命令,如果环境中存在.lat ...
LaTeX 参考文献笔记
整理一下LaTeX中关于参考文献的内容。
原始方式
LaTeX提供的对参考文献的底层支持是thebibliography环境,相当于一个特殊的列表。在使用的地方立刻生成参考文献列表,每一项以\bibterm开始,使用示例如下
12345678910111213\documentclass{article}\begin{document}According to Einstein's theory of relativity \cite{einstein1905}...\begin{thebibliography}{99}\bibitem{einstein1905} Albert Einstein. \textit{On the Electrodynamics of Moving Bodies}. Annalen der Physik, 1905.\bibitem{knuth1984} Donald E. Knuth. ...
LaTeX 字体配置
LaTeX说到底还是一个排版系统,字体是排版关注的核心内容之一,但是由于历史原因,字体系统在设计和使用中混乱不堪,
深究起来就是巨坑,这里简单整理一下LaTeX在中文排版时的字体配置相关知识。
由于版权原因,Tex
Live虽然已经打包了很多内容,但是并不会包括一些常见的中文字体,需要用户自行配置处理。
由于本文中的命令需要直接或间接依赖fontspec宏包,它是一个基于XeLaTeX和LuaLaTeX的字体配置宏包,因此不支持pdfLaTeX,
这个宏包可能会影响数学字体,在使用时可以传入no-math选项。
本文只考虑ctex宏包,在Windows/Linux系统的中文字体排版,并且只使用XeLaTeX。
本文主要参考ctex用户文档,以及LaTeX
中文字体配置基础指南
中文字体常识
与书法字体不同,中文印刷/显示字体主要有以下几种:
楷体:源自实际书写中的楷体得到的字体
宋体:从唐宋直到明清,印刷行业对字体从楷体进行的简化,典型的特点是横平竖直,并且有尖角等辅助结构。(与宋朝没什么特别关系,主要定型于明朝,在清朝被改称宋体,在日本被称为明体)
仿宋:因为宋体不美观,在民国 ...
初边值问题的相容性分析
边界离散
考虑如下的一维初边值问题 \[
\left\{
\begin{aligned}
& u_t = u_{xx} + f(x,t), \,\, x \in (0,1),t>0\\
& u(x,0) = u_0(x),\,\, x \in (0,1)
\end{aligned}
\right.
\] 我们取左侧为整网格,即 \(x_0 =
0\),\(x_1 = \Delta
x\),边界条件为 \[
B_1(u) = a u + b u_x = g(t),\,(x = 0)
\] 取右侧网格为半网格,即 \(x_{N-1} =
1-\frac{\Delta x}2\),\(x_N = 1 +
\frac{\Delta x}2\),边界条件为 \[
B_2(u) = c u + d u_x = h(t),\,(x=1)
\] 这里 \(a,b,c,d\)
均为常数。
对于内部直接采用二阶离散 \[
\frac{v_{j}^{n+1}-v_j^n}{\Delta t} = \frac{v_{j+1}^n-2v_j^n +
v_{j-1}^n}{\Delta x^ ...