并行计算
并行计算的目的:利用多核或多个计算机来减少程序运行的时间。
基本思路:将一个复杂的大问题,分解成多个子问题,然后并行或并发地处理多个子问题。
并行编程通常要考虑两个方面:
1.Computer architecture (hardware aspect)
2.Parallel programming (software aspect)
早期的时候,一个芯片上只有一个核,现在是一个芯片上多个核multicore。
并行化
1.任务并行化(多个任务或者多个函数间相互独立,可以同时执行)
2.数据并行化(不同的数据块可以同时处理)
数据并行化
1.块划分
2.循环划分

块划分和循环划分可以想象成分苹果,比如有四个苹果,分给四个人,块划分就是每个人吃一个苹果,循环划分就是每个人吃每个苹果的四分之一。

计算结构
1.单指令单数据
2.单指令多数据(多个cores在不同的数据流上执行相同的指令)
3.多指令单数据
4.多指令多数据
不同的体系机构都应该考虑3个指标
1.降低延迟(从开始到结束的执行时间)
2.提高带宽(单位时间内读取或写入的数据量)
3.提高吞吐量(单位时间内完成的单精度或双精度计算量)

CPU的大部分晶体管都进行了逻辑控制,更注重延迟,GPU更注重吞吐量,CPU的一个Core计算很快,相当于是一个出租车,计算很快,GPU的一个Core计算能力不如CPU,但是GPU胜在有成百上千的Core,GPU相当于公交车,虽然速度慢,但是一次可载的人多,计算的吞吐量更高。
异构计算
同构:相同的体系结构,比如Spark集群。
异构:不同体系结构的,比如CPU+GPU。
异构应用程序包含两部分:host(主机)串行代码+device(GPU)并行代码。
NVIDIA’s GPU computing platform
- Tegra(嵌入式、移动端)
- GeForce(消费级显卡)
- Quadro(专业的图形处理)
- Tesla(通用并行计算)
影响GPU计算能力的要素
- Number of CUDA cores
- Memory size
描述GPU的计算能力: - Peak computational performance(单双精度计算/s)
-
Memory bandwidth((read/store)/s)
Fermi&Kepler
计算能力(数字并不能真实的反应计算能力)
- Kepler class architecture is major version number 3.
- Fermi class architecture is major version number 2.
- Tesla class architecture is major version number 1.
程序的并行性能
- 并行程度
- 数据集的大小
CUDA程序结构
- 分配GPU上的显存
- 传输数据CPU到GPU
- 启动kernel函数,GPU并行计算
- 传输数据GPU到CPU
- 释放GPU显存
编写CUDA程序要考虑2个局部性
- 时间局部性(线程的层次)
- 空间局部性(存储器的层次)
example
__global__ void helloFromGPU()
{
printf("Hello World from GPU!\n");
}
int main(int argc, char **argv)
{
printf("Hello World from CPU!\n");
helloFromGPU<<<1, 10>>>();
CHECK(cudaDeviceReset());
return 0;
}
编译和运行
$ nvcc -arch sm_20 hello.cu -o hello
$ ./hello
如果去掉了cudaDeviceReset()输出结果为空。
参考书籍:CUDA C Programing
网友评论