程序流程
法1:
1 申请内存(host,device)
2 数据传输
//将host中的数据拷贝到device中 (CPU完成的内容)
cudaMemcpy((void*)d_x,(void*)x,nBytes,cudaMemcpyHostToDevice);//将cpu中的x拷贝到gpu中的d_x
/*(void*)d_x 目标区域
(void*)x 源数据
nBytes 需要复制的字节数
cudaMemcpyHostToDevice 数据传输的
*/
3 执行kernel,完成运算
4 device的结果传输回host
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include<iostream>
#include <stdio.h>
//包含库
using namespace std;
//cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);
//host调用的在device上执行的函数
__global__ void add(float* x, float * y, float* z, int n)
{
// 获取全局索引
int index = threadIdx.x + blockIdx.x * blockDim.x;
// 步长
int stride = blockDim.x * gridDim.x;
for (int i = index; i < n; i += stride)
{
z[i] = x[i] + y[i];
}
}
//GPU并行运算编程一般流程
int main()
{
int N = 1 << 20;
int nBytes = N * sizeof(float);
//一般流程
/******************************************************************/
//1 为host申请内存(CPU完成的内容)
float *x,*y,*z;
x = (float*)malloc(nBytes);
y = (float*)malloc(nBytes);
z = (float*)malloc(nBytes);
//初始化数据 两个数组
for (int i = 0; i < N; ++i)
{
x[i] = 10.0;
y[i] = 20.0;
}
/******************************************************************/
//2 申请device中的内存 在GPU中完成
float *d_x, *d_y, *d_z;
d_x = (float*)cudaMalloc((void**)&d_x, nBytes);
d_y = (float*)cudaMalloc((void**)&d_y, nBytes);
d_z = (float*)cudaMalloc((void**)&d_z, nBytes);
//将host中的数据拷贝到device中 (CPU完成的内容)
cudaMemcpy((void*)d_x,(void*)x,nBytes,cudaMemcpyHostToDevice);//将cpu中的x拷贝到gpu中的d_x
/*(void*)d_x 目标区域
(void*)x 源数据
nBytes 需要复制的字节数
cudaMemcpyHostToDevice 数据传输的
*/
cudaMemcpy((void*)d_y, (void*)y, nBytes, cudaMemcpyHostToDevice);//将cpu中的y拷贝到gpu中的d_y
/******************************************************************/
//3 定义kernel的执行配置
dim3 blockSize(256);
dim3 gridSize((N + blockSize.x - 1) / blockSize.x);
// 执行kernel
add << < gridSize, blockSize >> >(d_x, d_y, d_z, N);https://img-blog.csdn.net/20180318132515657?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L3hpYW9odTIwMjI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70
// 将device得到的结果拷贝到host
cudaMemcpy((void*)z, (void*)d_z, nBytes, cudaMemcpyHostToDevice);
// 检查执行结果
float maxError = 0.0;
for (int i = 0; i < N; i++)
maxError = fmax(maxError, fabs(z[i] - 30.0));
std::cout << "最大误差: " << maxError << std::endl;
// 释放device内存
cudaFree(d_x);
cudaFree(d_y);
cudaFree(d_z);
// 释放host内存
free(x);
free(y);
free(z);
return 0;
}