因学习需要,需要把算法运行速度优化,现在有cuda这个平台,所以先学习着怎么编写程序
框架结构什么的打算边学程序边学,因为一直看框架理论,理解也不是很深刻
主要参考CUDA实战这本书,开始编程学习,期望可以快速入门,后面再加以理论方面的补充,能够完成算法实现速度的优化
在此之前,CUDA的实验平台已经全部弄好了(不是自己弄的,心里发慌)
- 核函数调用
# include "cuda_runtime.h" #include "device_launch_parameters.h" #include <stdio.h> __global__ void kernel(void) { } int main() { kernel << <1, 1 >> > (); printf("Hello world!\n"); return 0; }
与普通的程序相比,这里多了一个空的函数kernel(),并且带有修饰符
对内核函数的调用,带有修饰字符<<<>>>(不知道为什么这个修饰字符会被标红)
这些参数的意义会在后面更深的了解
- 传递参数
对上述程序进行修改,实验将参数传递给核函数
# include "cuda_runtime.h" #include "device_launch_parameters.h" #include <stdio.h> __global__ void add(const int a, const int b, int *c) { *c = a + b; } int main() { int c; int *dev_c; // 定义在设备端的接收数据的指针 cudaError_t cudaStatus; //为输入参数和输出参数分配内存 cudaStatus = cudaMalloc((void**)&dev_c, sizeof(int)); if (cudaStatus != cudaSuccess) { printf("cudaMalloc is failed!\n"); } //调用内核函数 add << <1, 1 >> > (2, 7, dev_c); //把输出参数从设备端复制到主机 cudaStatus = cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost); if (cudaStatus != cudaSuccess) { printf(" cudaMemcpyDeviceToHost is failed!\n"); } //释放设备端的内存 cudaFree(dev_c); printf("2+7=%d", c); return 0; }
与C语言类似,Cuda C是对C语言的扩展,方便对设备端进行一系列操作;在学习过程中,不断积累这些常用的操作函数;
cudaMalloc()
用来分配内存,第一个参数是一个指针,指向用于保存新分配内存地址的变量,第二个参数是分配内存的大小
设备指针的限制:
可以将cudaMalloc()分配的指针传递给在设备上执行的函数
可以在设备代码中使用cudaMalloc()分配的指针进行内存读写操作
可以将cudaMalloc()分配的指针传递给在主机上执行的函数
不能在主机代码中使用cudaMalloc()分配的指针进行内存读写操作
cudaMemcpy()
用于主机端与设备端之间的交互,数据的传递