第 20 期:想与命运赛跑,就必须走过生命中最崎岖的路。
最后更新于
最后更新于
@Author : Lewis Tian (taseikyo@gmail.com)
@Link : github.com/taseikyo
@Range : 2021-03-14 - 2021-03-20
本文总字数 4687 个,阅读时长约:9 分 17 秒,统计数据来自:算筹字数统计。
*Photo by Jose Antonio Gallego Vázquez on Unsplash
为什么苹果的 M1 芯片这么快?
使用 FFmpeg 从视频创建动画 GIF 和 WebP
论文写作的又一利器:VSCode + Latex Workshop + MikTex + Git
在线图片编辑网站
想与命运赛跑,就必须走过生命中最崎岖的路。
这是一篇相当长的文章,值得是一篇会员文,介绍了 RISC/CISC,异构架构和统一架构,重点是苹果的 M1 芯片为啥比 AMD 和 Intel 的快(废话)。
点我查看 The M1 is not a CPU, it is one whole computer onto a chip. The M1 contains a CPU, graphical processing unit (GPU), memory, input and output controllers, and many more things making up a whole computer. This is what we call a system on a chip (SoC). Instead of adding ever more general-purpose CPU cores, Apple has followed another strategy: They have started adding ever more specialized chips doing a few specialized tasks. 这相当于把芯片按功能拆分,就如之前把图形计算的功能集成到 GPU 一样。 Rather than just having general-purpose cores and memory, the M1 contains a wide variety of specialized chips: - CPU - GPU - DSP, Digital signal processor, handles more mathematically intensive functions than a CPU. decompressing music files. - NPU, Neural processing unit, used in high-end smartphones to accelerate machine learning (AI) tasks. voice recognition and camera processing. - Video encoder/decoder - Secure Enclave - Unified memory, allows the CPU, GPU, and other cores to quickly exchange information 由于有专门的视频解码器,显然用 M1 芯片的 Mac 进行图片视频编辑速度很快。 For a long time cheap computer systems have had the CPU and GPU integrated into the same chip (same silicon die). These have been famously slow. In the past saying "integrated graphics" was essentially the same as saying "slow graphics." 廉价的计算机系统将 CPU 和 GPU 集成到同一个芯片(相同的硅芯片)中。在过去说"集成图形"本质上等同于说"慢图形"。 原因有几点: 1、内存的不同区域被保留给 CPU 和 GPU,如果 CPU 想用 GPU 的数据,那么必须从 GPU 的内存拷过来。 2、CPU 和 GPU 使用内存的方式不同,CPU 需要快,GPU 需要多。需求不同,将它们放一起并不是一个好主意,且浪费了 GPU 的性能。 3、GPU 会产生大量热量,将其和 CPU 集成到一起会导致 CPU 受影响,这也是为什么独显有有很多风扇。 苹果的统一架构(Unified Memory Architecture)试图解决这个问题: 1、不区分 CPU 和 GPu 内存使用区域,它们可以使用相同的内存,而不需要拷贝。 2、Apple uses memory which serves both large chunks of data and serves it fast (low latency and high throughput) 3、苹果已经降低了 GPU 的功率利用率,这样一个相对强大的 GPU 可以集成在一起而不会过热 SoC。而且 ARM 芯片产生的热量更少,这使得 GPU 的热量预算高于 AMD 和 Intel CPU 芯片上的 GPU。 要获得这种高带宽内存需要完全集成,这意味客户不能升级内存了。 AMD 也开始在他们的一些芯片上安装更强大的 GPU,并逐渐向某种形式的 SoC 发展,其加速处理单元(APU)基本上是放在同一个硅芯片上的 CPU 核和 GPU 核。 如何让 CPU 更快,理论上有两种方法: 1、以更快的速度按顺序执行更多指令 2、并行执行大量的指令 在 80 年代,很容易实现。只要增加时钟频率,指令就能更快地完成。如今已经无法增加时钟频率了,因此只能往第二点发展。 又有两个方法实现上述第二点:增加更多 CPU;让每个 CPU 并行执行多个指令。 为了制造更强大的核,我们需要它并行执行更多的指令。Out-of-Order execution (OoOE,乱序执行)是一种并行执行更多指令的方法,但是不需要将这种能力暴露为多个线程乱序执行。 基本上有两种形式的并行: 一种是开发人员在编写代码时必须显式处理的,另一种是完全透明的。当然,后者依赖于 CPU 上大量的晶体管,这些晶体管专门用于乱序执行。 正是卓越的 Out-of-Order 执行力,让 M1 上的 Firestorm 核心大放异彩 AMD 和 Intel 使用 x86 ISA,而苹果的硅芯片,如 M1,使用 ARM ISA 快速运行的能力取决于能以多快的速度填满微操作的缓冲区(micro-operations buffer),且如果有一个大的缓冲区,那么 OoOE 硬件将有一个更容易的时间来定位两个或更多的指令,它可以并行运行。快速重新填充指令缓冲区的能力依赖于将机器代码指令快速切分到微操作系统中的能力,这个硬件叫做解码器。 AMD 和 Intel 有 4 个解码器,而 M1 有 8 个;M1 的指令缓冲区比一般的大 3 倍(也就是说堆料呗 那么为啥 AMD 和 Intel 不加解码器呢? x86 指令的长度可以从 1 到 15 字节不等;ARM 指令都是 4 字节。 每条指令都具有相同的长度,那么将一个字节流分割成并行提供给八个不同解码器的指令就变得非常简单。 在 x86 CPU 上,解码器不知道下一条指令从哪里开始。它必须对每条指令进行实际分析,以确定它的长度。 还有一些其他原因,AMD 堆四个解码器已经是上限了。 这就是为什么 M1的 Firestorm 可以在相同的时钟频率下处理两倍于 AMD 和 Intel cpu 的指令。 AMD 最新的 Zen3 比 Firestorm 要快一些。但是只有在 Zen3 内核的频率是 5GHz 的情况下才会发生这种情况。Firestorm 频率为3.2 GHz。尽管 Zen3 的时钟频率几乎提高了60% ,但它刚刚超过 Firestorm。 那么为什么苹果不提高时钟频率呢?因为更高的时钟频率使芯片运行更热。这是苹果的关键卖点之一。与英特尔和 AMD 的产品不同,他们的电脑几乎不需要冷却。 但是对于 AMD 和 Intel 来说幸运的是,苹果并没有在市场上销售他们的芯片。所以个人用户将不得不忍受他们提供的芯片。
我之前见过 webp 格式的图片,单知道它是谷歌出的格式,而且有些软件并不能识别。而我用 ffmpeg
也大多是裁剪/合并视频或者提取音频,此文章介绍了如何使用 ffmpeg
将视频转化为 webp 和 gif 格式的动图。
即使在2021年,大多数转换工具也不支持 WebP 格式。WebP 是基于 VP8的,这是一个相对于 GIF 图像格式来说比较新的视频编解码标准。
下面给出了如何转换的命令:
点我查看 1、将整个视频转换为 GIF 格式 格式: ```Bash ffmpeg -i $INPUT_FILENAME \ -vf "fps=$OUTPUT_FPS,scale=$OUTPUT_WIDTH:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \ -loop $NUMBER_OF_LOOPS $OUTPUT_FILENAME # Change these placeholders: # * $INPUT_FILENAME - path to the input video. # * $OUTPUT_FPS - ouput frames per second. Start with `10`. # * $OUTPUT_WIDTH - output width in pixels. Aspect ratio is maintained. # * $NUMBER_OF_LOOPS - use `0` to loop forever, or a specific number of loops. # * $OUTPUT_FILENAME - the name of the output animated GIF. ``` 实例: ```Bash ffmpeg -i "sample_recording.mp4" \ -vf "fps=10,scale=720:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \ -loop 0 sample_recording.gif ``` 2、将部分视频转换为 GIF 格式 ```Bash ffmpeg -ss $INPUT_START_TIME -t $LENGTH -i $INPUT_FILENAME \ -vf "fps=$OUTPUT_FPS,scale=$OUTPUT_WIDTH:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \ -loop $NUMBER_OF_LOOPS $OUTPUT_FILENAME # Change these placeholders: # * $INPUT_START_TIME - number of seconds in the input video to start from. # * $LENGTH - number of seconds to convert from the input video. # * $INPUT_FILENAME - path to the input video. # * $OUTPUT_FPS - ouput frames per second. Start with `10`. # * $OUTPUT_WIDTH - output width in pixels. Aspect ratio is maintained. # * $NUMBER_OF_LOOPS - use `0` to loop forever, or a specific number of loops. # * $OUTPUT_FILENAME - the name of the output animated GIF. ``` 示例: ```Bash ffmpeg -ss 32.5 -t 7 -i "sample_recording.mp4" \ -vf "fps=10,scale=720:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \ -loop 0 sample_recording.gif ``` 3、将整个视频转换为动画 WebP 格式: ```Bash ffmpeg -i $INPUT_FILENAME \ -vf "fps=$OUTPUT_FPS,scale=$OUTPUT_WIDTH:-1:flags=lanczos" \ -vcodec libwebp -lossless 0 -compression_level 6 \ -q:v $OUTPUT_QUALITY -loop $NUMER_OF_LOOPS \ -preset picture -an -vsync 0 $OUTPUT_FILENAME # Change these placeholders: # * $INPUT_FILENAME - path to the input video. # * $OUTPUT_FPS - ouput frames per second. Start with `10`. # * $OUTPUT_WIDTH - output width in pixels. Aspect ratio is maintained. # * $OUTPUT_QUALITY - quality of the WebP output. Start with `50`. # * $NUMBER_OF_LOOPS - use `0` to loop forever, or a specific number of loops. # * $OUTPUT_FILENAME - the name of the output animated WebP. ``` 示例: ```Bash ffmpeg -i "sample_recording.mp4" \ -vf "fps=10,scale=720:-1:flags=lanczos" \ -vcodec libwebp -lossless 0 -compression_level 6 \ -q:v 50 -loop 0 \ -preset picture -an -vsync 0 sample_recording.webp ``` 4、将视频的一部分转换为动画 WebP 格式: ```Bash ffmpeg -ss $INPUT_START_TIME -t $LENGTH -i $INPUT_FILENAME \ -vf "fps=$OUTPUT_FPS,scale=$OUTPUT_WIDTH:-1:flags=lanczos" \ -vcodec libwebp -lossless 0 -compression_level 6 \ -q:v $OUTPUT_QUALITY -loop $NUMER_OF_LOOPS \ -preset picture -an -vsync 0 $OUTPUT_FILENAME # Change these placeholders: # * $INPUT_START_TIME - number of seconds in the input video to start from. # * $LENGTH - number of seconds to convert from the input video. # * $INPUT_FILENAME - path to the input video. # * $OUTPUT_FPS - ouput frames per second. Start with `10`. # * $OUTPUT_WIDTH - output width in pixels. Aspect ratio is maintained. # * $OUTPUT_QUALITY - quality of the WebP output. Start with `50`. # * $NUMBER_OF_LOOPS - use `0` to loop forever, or a specific number of loops. # * $OUTPUT_FILENAME - the name of the output animated WebP. ``` 示例: ```Bash ffmpeg -ss 32.5 -t 7 -i "sample_recording.mp4" \ -vf "fps=10,scale=720:-1:flags=lanczos" \ -vcodec libwebp -lossless 0 -compression_level 6 \ -q:v 50 -loop 0 \ -preset picture -an -vsync 0 sample_recording.webp ```
如何选择(gif or webp)?
现代浏览器支持动画 WebP,质量也更高,但是所需的处理能力也更高。
今天搜 VS Code 正向/反向搜索时发现这篇文章,巧的是我也是这么做的。
我现在都是用 Scoop 来管理 Windows 上的软件的,包括 Python、ffmpeg、aria2c、7zip、pandoc、go、gcc 以及 MikTex 等等。它的使用跟 Ubuntu 的包管理器 apt 类似,很方便,但是在使用 Python 的时候很烦,一旦升级就得将所有第三方库重装一遍。
扯远了,我现在写论文就是用 VS Code 写和编译,安装 Latex Workshop 插件,将相关配置设置好,用 SumatraPDF 看 pdf 就可以正反搜索,很方便,版本管理就用 GitHub。
Latex Workshop 的配置也有很多,我记得当时是看一个知乎的文章给出的配置,直接复制粘贴的,然后修改两个软件的路径即可。
下面是我的 Latex Workshop 配置,注意不要把 "paper.synctex.gz" 删了,否则就不能正反搜索了。
点我查看 ```JSON "latex-workshop.latex.autoClean.run": "onBuilt", "latex-workshop.latex.clean.fileTypes": [ "*.aux", "*.bbl", "*.blg", "*.idx", "*.ind", "*.lof", "*.lot", "*.out", "*.toc", "*.acn", "*.acr", "*.alg", "*.glg", "*.glo", "*.gls", "*.ist", "*.fls", "*.log", "*.fdb_latexmk", // "*.gz", "*.nav", "*.snm", "*.cut" ], "latex-workshop.view.pdf.viewer": "external", "latex-workshop.view.pdf.external.viewer.command": "D:/Programs/SumatraPDF/SumatraPDF.exe", "latex-workshop.view.pdf.external.synctex.command": "D:/Programs/SumatraPDF/SumatraPDF.exe", "latex-workshop.view.pdf.external.synctex.args": [ "-forward-search", "%TEX%", "%LINE%", "-reuse-instance", "-inverse-search", "\"D:/Programs/Microsoft VS Code/Code.exe\" \"D:/Programs/Microsoft VS Code/resources/app/out/cli.js\" -r -g \"%f:%l\"", "%PDF%", ], "latex-workshop.latex.recipes": [ { "name": "pdflatex -> bibtex -> pdflatex*2", "tools": [ "pdflatex", "bibtex", "pdflatex", "pdflatex" ] }, { "name": "xelatex", "tools": [ "xelatex", "xelatex" ] }, { "name": "xe->bib->xe*2", "tools": [ "xelatex", "bibtex", "xelatex", "xelatex" ] }, { "name": "xelatexb", "tools": [ "xelatex", "bibtex", "xelatex", "xelatex" ] }, { "name": "latexmk", "tools": [ "latexmk" ] }, ], "latex-workshop.latex.tools": [ { "name": "xelatex", "command": "xelatex", "args": [ "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "%DOC%" ] }, { "name": "latexmk", "command": "latexmk", "args": [ "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "-pdf", "%DOC%" ] }, { "name": "pdflatex", "command": "pdflatex", "args": [ "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "%DOC%" ] }, { "name": "bibtex", "command": "bibtex", "args": [ "%DOCFILE%" ] } ], "latex-workshop.latex.clean.subfolder.enabled": true, ```
SumatraPDF 的配置很简单,"设置->选项->设置反向搜索命令行",填入 "D:\Program Files\Microsoft VS Code\Code.exe" "D:\Program Files\Microsoft VS Code\resources\app\out\cli.js" -g "%f":%l"
配置好了之后,在 SumatraPDF 双击论文会跳转 VS Code 的对应位置;而在 VS Code 中,在 Latex Workshop 左侧控制面板(不知道怎么叫)的 COMMAND 区域,点击 "NAvigates, select, and edit -> SyncTex from cursor" 会跳转到 SumatraPDF 的论文对应部分,这就跟 overleaf 的功能一样。
更多:
有个很亮眼的可以自定义裁剪尺寸,这下不用没错裁一个自定义的尺寸比就得打开 ps 了,这个网站还有一些其他的编辑方式(特效、美颜、边框等等),暂时仅使用了缩放和裁剪。
来自 中国减贫密码 纪录片中的一句话。
没有天赋和背景,想要跑过命运,就必须付出更多的努力、走更多弯路。
然而也有人说过,一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的进程。
那么问题来了,历史的进程由什么决定?