【CUDA】学习记录(1)-异构编程

并行计算

并行计算的目的:利用多核或多个计算机来减少程序运行的时间。
基本思路:将一个复杂的大问题,分解成多个子问题,然后并行或并发地处理多个子问题。
并行编程通常要考虑两个方面:
1.Computer architecture (hardware aspect)
2.Parallel programming (software aspect)
早期的时候,一个芯片上只有一个核,现在是一个芯片上多个核multicore。

并行化

1.任务并行化(多个任务或者多个函数间相互独立,可以同时执行)
2.数据并行化(不同的数据块可以同时处理)

数据并行化

1.块划分
2.循环划分


【CUDA】学习记录(1)-异构编程_第1张图片
块划分和循环划分

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


【CUDA】学习记录(1)-异构编程_第2张图片
二维数据的情况

计算结构

1.单指令单数据
2.单指令多数据(多个cores在不同的数据流上执行相同的指令)
3.多指令单数据
4.多指令多数据

不同的体系机构都应该考虑3个指标

1.降低延迟(从开始到结束的执行时间)
2.提高带宽(单位时间内读取或写入的数据量)
3.提高吞吐量(单位时间内完成的单精度或双精度计算量)

【CUDA】学习记录(1)-异构编程_第3张图片
CPU vs GPU

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计算能力的要素

  1. Number of CUDA cores
  2. Memory size
    描述GPU的计算能力:
  3. Peak computational performance(单双精度计算/s)
  4. Memory bandwidth((read/store)/s)


    【CUDA】学习记录(1)-异构编程_第4张图片
    Fermi&Kepler

计算能力(数字并不能真实的反应计算能力)

  1. Kepler class architecture is major version number 3.
  2. Fermi class architecture is major version number 2.
  3. Tesla class architecture is major version number 1.

程序的并行性能

  1. 并行程度
  2. 数据集的大小

CUDA程序结构

  1. 分配GPU上的显存
  2. 传输数据CPU到GPU
  3. 启动kernel函数,GPU并行计算
  4. 传输数据GPU到CPU
  5. 释放GPU显存

编写CUDA程序要考虑2个局部性

  1. 时间局部性(线程的层次)
  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

你可能感兴趣的:(【CUDA】学习记录(1)-异构编程)