vs2017编写CUDA简易程序(矩阵的加,乘运算)

程序流程

法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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值