1 引言
算法在工程化过程中,最躲不开就是算法的优化问题。优化分很多个方向,最简单的实现方式是并行化加速。如:一个向量相加,在cpu中你是串行一个元素一个元素的加减,如果采用并行化加速,你可以一次操作,可以将向量加法完成。当然,并行化的实现方式大概分两类:(1) cpu多线程的方法,如:openmp,(2)异构计算的方法。如gpu加速,fpga加速,NPU加速等。cpu多线程的方法的必要条件就是你得有足够的计算资源,往往在自动驾驶等任务中,cpu往往是稀缺资源。所以异构计算是最常被使用的方法,而异构计算中,没有比N卡的cuda框架更通用的了。为此,我们总结一下cuda的使用方法。
说明:cuda的安装和配置网上资源比较多,暂时先不写了。等以后有时间再补上吧。强调一下gpu驱动版本一定要和cuda版本相对应,不然没法运行
检查下环境
nvcc --version
#输出类似
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2015 NVIDIA Corporation
Built on Tue_Aug_11_14:27:32_CDT_2015
Cuda compilation tools, release 7.5, V7.5.17
我们以一个例子,作为入门课程。而不是一上来就来一堆硬件知识,直接把你干懵逼。
2 cpu版的数组加法
2.1 自动内存管理
cpu_arr_add.cpp
#include <stdio.h>
int main(){
//step1
int num = 10;
int a[num],b[num],c[num];
//step2
for(size_t i=0; i<num; ++i){
a[i] = i;
b[i] = 2*i;
}
//step3
for(size_t i=0; i<num; ++i){
c[i] = a[i] + b[i];
}
for(size_t i=0; i<num; ++i){
printf("%d + %d = %d\n", a[i], b[i], c[i]);
}
//step4
return 0;
}
采用gcc编译一下
gcc cpu_arr_add.cpp -o cpu_arr_add
运行一下
./cpu_arr_add
0 + 0 = 0
1 + 2 = 3
2 + 4 = 6
3 + 6 = 9
4 + 8 = 12
5 + 10 = 15
6 + 12 = 18
7 + 14 = 21
8 + 16 = 24
9 + 18 = 27
我们来分析一下,整个程序执行的过程。整个执行过程可以分为下面四个步骤: