cuda 算法

1 引言 算法在工程化过程中,最躲不开就是算法的优化问题。优化分很多个方向,最简单的实现方式是并行化加速。如:一个向量相加,在cpu中你是串行一个元素一个元素的加减,如果采用并行化加速,你可以一次操作,可以将向量加法完成。当然,并行化的实现方式大概分两类:(1)

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

我们来分析一下,整个程序执行的过程。整个执行过程可以分为下面四个步骤:

知秋君
上一篇 2024-08-03 22:02
下一篇 2024-08-03 21:36

相关推荐