【cuda大师班】p12 主机和设备之间的数据传递

本文展示了如何使用CUDA进行主机与设备间的数据传递,通过`cudaMalloc`和`cudaMemcpy`实现内存分配与拷贝。示例代码中定义了一个`__global__`函数`mem_trs_test`用于设备上的计算,并通过线程块和网格进行并行处理。文章还讨论了线程检查的重要性,以避免超出分配的内存范围。
摘要由CSDN通过智能技术生成

一.主机和设备之间的数据传递
1.1 基本流程框图
在这里插入图片描述
1.2 数据传递函数
在主机和设备之间必须显式的传递数据
在这里插入图片描述
1.3 代码
使用h_ 表示某个变量是主机变量
使用d_ 表示某个变量是主机变量

在这里插入图片描述

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <time.h>

__global__ void mem_trs_test(int* input)
{

	int gid = blockIdx.x * blockDim.x + threadIdx.x;
	printf(" tid : %d,gid : %d ,value: %d \n",
		threadIdx.x, gid, input[gid]);

}

int main()
{
	int size = 128;
	int byte_size = sizeof(int) * size;
	
	int* h_input;
	h_input = (int*)malloc(byte_size);

	time_t t;
	srand((unsigned)time(&t));

	for (int i = 0; i < size; i++)
	{
		h_input[i] = (int)(rand() & 0xff);
		printf("%d ", h_input[i]);
	}

	//在device中分配内存
	int* d_input;
	cudaMalloc((void**)&d_input, byte_size);
			//转化为泛型指针
	cudaMemcpy(d_input, h_input, byte_size, cudaMemcpyHostToDevice);

	dim3 block(64);
	dim3 grid(2);


	//访问全局
	mem_trs_test << <grid, block >> > (d_input);

	cudaDeviceSynchronize();
	//回收
	cudaFree(d_input);
	free(h_input);

	cudaDeviceReset();

	return 0;
}

使用指针直接指定是有弊端的。提供线程数(32的倍数)和需要的线程数(可能不是32的倍数)可能不能一一对应,余下线程应该不进行操作。

线程检查

__global__ void mem_trs_test2(int* input,int size)
{

	int gid = blockIdx.x * blockDim.x + threadIdx.x;
	//在执行前检查size
	if (gid < size)
	{
		printf(" tid : %d,gid : %d ,value: %d \n",
			threadIdx.x, gid, input[gid]);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值