很早就知道gpu可以被用来进行加速处理,但是不知道基本原理是什么。昨天看了一下别人的示范代码,突然之间明白了很多。为了防止自己忘记这些知识点,特地做如下纪录。
1、显卡编程
gpu主要是指显卡上的处理器部分。显卡和cpu之间主要通过pci或者pcie连接,所以必然要求生成的可执行文件一部分在host运行、一部分在gpu运行。
2、cuda文件格式
一般以cu作为后缀。
3、cuda的构成
cuda和基本的c语言文件没有差别,只是需要注意的是,那些标记为__global的函数才是真正在gpu上运行的代码。
4、cuda和mpi关系
mpi主要是intel利用cpu并发执行的lib,cuda则是利用gpu运行的库。
5、cuda怎么编译
建议用nvidia提供的nvcc进行编译。
6、asic、fpga、cpu、gpu加速
机器学习要求我们必须穷尽各种加速方法。asic侧重于controller加速、表现在编解码、加密方面。fpga可用于特定的算法处理,虽然效果最好,但是成本最高。cpu加速最简单,但是成本不好控制、编写有难度。gpu是次优于cpu的方法,它可以降低cpu的负担,又可以承担一定的计算任务。
7、cuda 与linux
随着tensorflow的流行,cuda也被用于深度学习。一般cuda和ubuntu配合比较多,建议大家多多学习。
8、示例代码,参考链接
9、nvidia教程
https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html
基本代码形式如下所示,特别是这个__global__关键字非常重要,它代表是在GPU上面执行的代码
// Kernel definition
__global__ void VecAdd(float* A, float* B, float* C)
{
int i = threadIdx.x;
C[i] = A[i] + B[i];
}
int main()
{
...
// Kernel invocation with N threads
VecAdd<<<1, N>>>(A, B, C);
...
}
ps:
cuda主要用来进行算法加速优化使用,常用于图像,当然使用到矩阵、傅里叶变换的地方都可以使用,这是使用比较多的一个场景。