cuda代码实现步骤
- 声明分配host和device memory
- 初始化host数据
- 从host到device转移数据
- 执行一个或者更多核心
- 转移device结果到host
常用的cuda函数
cudaMalloc(&device_var,sizeofarray)
:通常device_var
表示gpu上为数组开辟的空间,sizeofarray
:数组占据的bit位数。host上分配空间(type*)malloc(sizeofarray)
,type
表示数据类型,如:float
cudaMemcpy(d_x, x, N*sizeof(float), cudaMemcpyHostToDevice)
:d_x
表示在device上的变量的地址,x表示在host上的位置,N*sizeof(float)
表示长度为N的浮点数数据占据的比特数,cudaMemcpyHostToDevice
表示数据传递的方向是从Host到Device,cudaMemcpyDeviceToHost
表示数据传递的方向是从Device到Host。
#include <stdio.h>
__global__ void sax(int N,float *x,float *y,float a){
int i = threadIdx.x+blockDim.x*blockIdx.x;
if(i<N){
y[i] = a*x[i]+y[i];
}
}
int main(void){
int N = 1<<20;
float *x = (float*)malloc(N*sizeof(float));
float *y = (float*)malloc(N*sizeof(float));
float *d_x,*d_y;
for(int i=0;i<N;i++)
{
x[i] = 1.0;
y[i] = 2.0;
}
cudaMalloc(&d_x,N*sizeof(float));
cudaMalloc(&d_y,N*sizeof(float));
cudaMemcpy(d_x,x,N*sizeof(float),cudaMemcpyHostToDevice);
cudaMemcpy(d_y,y,N*sizeof(float),cudaMemcpyHostToDevice);
sax<<<(N+255)/256,256>>>(N,d_x,d_y,1.0);
cudaMemcpy(y,d_y,N*sizeof(float),cudaMemcpyDeviceToHost);
bool flag = false;
for(int i=0;i<N;i++)
{
if(y[i] == 3.0)
flag = true;
}
if(flag)
printf("Error %f",0.0);
cudaFree(d_x);
cudaFree(d_y);
free(x);
free(y);
}