2021-03-09

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值