CUDA编程学习记录(一)
最近在学习CUDA编程,记录一下,大概一周两次或者三次;
CUDA的含义
CUDA(Compute Unified Device Architecture, 统一计算设备架构)是英伟达提出的并行计算架构,主要用于并行运算;GPU与CPU是两个独立的处理器,但是通过PCI-E总线的链接, GPU可以协助CPU高效完成计算复杂度极高的程序,而对应的CPU则负责管理设备端的资源。
第一个CUDA程序–HelloWorld
实现hello world!
CUDA编程的一个基本流程是通过CPU调用GPU核函数实现功能,现在我们完成第一个函数编写;
#include <stdio.h>
__global__ void printHello(void){
printf("CPU,hello world!\n");
}
int main(void){
printf("CPU,hello world!");
printHello<<<1,1>>>();
cudaDeviceReset();
return 0;
}
这里我们完成了第一个函数的编写,在主函数中调用核函数,通过GPU完成打印语句;
简单的并行编程–向量加法
现在简单的来复习一下,CPU与GPU混合编程的基本流程;
//0、查询设备信息,选择设备
cudaEvent_t cudaGetDeviceProperties(cudaDeviceProp* prop, int deive);
//返回GPU设备属性
//1、设备端内存开辟
#defineN1024
int *dev_a,*dev_b,*dev_c;
cudaMalloc((void**)&dev_a,N*sizeof(int));
cudaMalloc((void**)&dev_b,N*sizeof(int));
cudaMalloc((void**)&dev_c,N*sizeof(int));
/*cudaMalloc的第一个参数传递的是存储在cpu内存中的指针变量的地址,
所以需要转换,需要把存储指针的地址传进来;*/
//2.复制数据
cudaMemcpy(dev_a,a,N_size,cudaMemcpyHostToDevide);
//将对应大小的数据复制进设备内存,函数是CUDA中的API
//3、调用核函数
kernel<<<blockPerGrid,threadsPerBlock>>>(dev_a,dev_b,dev_c);
//4.返回结果
cudaMemcpy(c,dev_c,N_size,cudaMemcpyHostToDevide);
//将计算结果返回主机内存;
// 5、设备重置
cudaDeviceReset();
这样的一个流程即为编程的基本过程
接下来,我们完整的写完一个向量加法程序;
#include <cuda_runtime.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 1024*512
__global__ void addArray(int *a, int *b,int *c){
int tid = threadIdx.x + blockIdx.x*blockDim.x;
c[tid] = a[tid]+b[tid];
}
int main(){
//
int *a, *b, *c;
a = (int *)malloc(N*sizeof(int));
b = (int *)malloc(N*sizeof(int));
c = (int *)malloc(N*sizeof(int));
for(int i=0;i<N;i++){
a[i] = 1;
b[i] = (rand()%128)+1;
}
memset(c,0,N*sizeof(int));
//
int * dev_a, *dev_b, *dev_c
cudaMalloc((void**)&dev_a,N*sizeof(int));
cudaMalloc((void**)&dev_a,N*sizeof(int));
cudaMalloc((void**)&dev_a,N*sizeof(int));
//
cudaMemcpy(dev_a,a,N*sizeof(int),cudaMemcpyHostToDevice);
cudaMemcpy(dev_b,b,N*sizeof(int),cudaMemcpyHostToDevice);
addArray<<<512,1024>>>(dev_a,dev_b,dev_c);
//
cudaMemcpy(c,dev_c,N*sizeof(int),cudaMemcpyDeviceToHost);
printf("Have done!");
free(a);
free(b);
free(c);
cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);
cudaDeviceReset();
return 0;
}
第一次的学习记录到此,如有错误,欢迎大家指出,共同进步;
2021.3.9