CUDA 编程入门(3):向量加法示例
前面的文章中,我们简单了解了 GPU 的硬件结构,以及建立在其之上的 CUDA 编程模型,现在,我们来通过一个简单的向量加法例子来展示如何使用 CUDA 的 C++ 扩展来开发一个并行计算程序。
首先,从硬件层面来看,CUDA 程序涉及到 CPU 端和 GPU 端的执行过程,其中 CPU 端又被称为 Host,GPU 端又被称为 Device。一个标准的并行计算流程是:
在 Host 端申请内存空间,分配数据,将数据拷贝到 Device 端;
在 Device 端定义算法,也就是 cuda kernel 方法;
在 Host 端调用 kernel 方法,启动计算任务;
在 Host 端等待计算任务完成,将计算结果从 Device 端拷贝回 Host 端。
下面...
点我阅读更多...
CUDA 编程入门(2):CUDA 编程模型
CUDA 的全称是 Compute Unified Device Architecture,它是建立在英伟达 GPU 硬件架构之上的并行计算平台和编程模型。
CUDA 计算模型
CUDA 计算模型是对 GPU 运算单元的抽象,它是一种分层次的计算结构,其中最基本的计算单位是线程 (Thread),从逻辑上来讲,每个 thread 可以负责计算任务的一部分,比如向量相加任务中的元素相加、矩阵乘法任务中的行列相乘等等。于是,通过 thread,我们可以将一个大的计算任务分解成多个小的计算任务,以更加细粒度的方式来调度,从而实现高效的并行计算。
Thread 的物理执行单元就是流处理器(SP),也就是说,每个 thread 都会被分配到一个 SP 执行,具体的调度过程是用户不可见的,由...
点我阅读更多...
CUDA 编程入门(1):英伟达GPU的硬件架构简介
CUDA 是建立在英伟达GPU硬件架构之上的并行计算平台和编程模型。因此,就像要写好高性能的 CPU 程序,必须对 CPU 的硬件架构有一定的理解一样,我们写 CUDA 程序也必须对 GPU 有最基本的了解。
从冯诺依曼体系结构说起
总所周知,冯诺依曼体系结构是现代计算机的基础,它包含了五个基本部件:运算器、控制器、存储器、输入设备和输出设备。其中,运算器和控制器合称为中央处理器(CPU),存储器包括内存和外存,输入设备和输出设备合称为外设。CPU 通过总线与内存和外设进行数据交换。
图1.1 冯诺依曼体系结构[1]
经过近几十年的高速发展,这些基本部件都变得无比复杂且强大。对于 CPU 来说,它的核心频率已达到数 GHz,核心数量也达到数十甚至上百个。而存储器则发展...
点我阅读更多...
图解自动微分的正向模式和逆向模式
自动微分建立在复合函数求导的链式规则之上,考虑以下复合函数
\[f(x) = a(b(c(x)))\]
则 \(f\) 对 \(x\) 的导数为
\[\frac{\mathrm{d}f}{\mathrm{d}x} = \frac{\mathrm{d}f}{\mathrm{d}a} \frac{\mathrm{d}a}{\mathrm{d}b} \frac{\mathrm{d}b}{\mathrm{d}c} \frac{\mathrm{d}c}{\mathrm{d}x}\]
显然,上述公式存在两种计算顺序,第一种先对高阶函数求导,我们称之为逆向模式
\[\frac{\mathrm{d}f}{\mathrm{d}x} =\left( \left(\frac{\mathrm{d}f...
点我阅读更多...
如何自底向上地建立起对 Monad 的理解
原群 (Magma)
如果存在一个集合 \(M\) 以及建立在其元素间的二元运算 \(\star\),满足 \(\forall x, y \in M\),有 \(x \star y \in M\),则称这样的集合为原群,写作 \((M, \star)\)。
半群 (Semigroup)
如果一个原群 \(M\) 的二元运算满足结合律性质,即 \(\forall x, y, z \in M \), 都有 \(x \star y \star z = x \star (y \star z)\),则称这样的结构为半群。
幺半群 (Monoid)
在半群的基础上,如果其中的二元运算存在单位元,即,\(\exists e \in G\),\(\forall x \in G\)...
点我阅读更多...