将二维指针传入gpu,并可以通过指针调用一维指针的数据

本文展示了如何在CUDA环境中,通过一维指针数组模拟二维数组,将数据从主机传输到设备(GPU),在核函数中进行操作,然后返回主机。主要步骤包括主机端和设备端的一维数组内存分配、数据拷贝以及指针的传递。
摘要由CSDN通过智能技术生成
#include <stdio.h>

/**
 * 需求:需要把若干个一维数组传给核函数
 * 实现方法:在gpu生成一个一维的指针数组,每个元素指向一个普通一维数组。
 * 把该指针数组的地址传递给核函数。
 * 其实该指针数组充当二维数组的角色。
 */
// 二维指针传入GPU,需要先将一维指针数组拷贝到GPU
// 需要一个主机端二维指针指向设备端的一维指针
// 然后将这个主机二维指针复制给设备上的二维指针,完成一维指针地址的传递
__global__ void
testKernel(float **gpuprintf)
{
	int i = threadIdx.x + threadIdx.y * blockDim.x;
	printf("%d:(%d,%d):%f\n", i, threadIdx.x, threadIdx.y, gpuprintf[threadIdx.y][threadIdx.x]);
	gpuprintf[threadIdx.y][threadIdx.x] = 10;
}

int main()
{

	int rows = 2;
	int cols = 2;

	float **h_data2d = new float *[rows]; // 主机端二维指针
	float **t_data2d = new float *[rows]; // 中间指针,主机端指针,指向设备端的一维指针

	float **d_data2d; // 设备端的二维指针
	cudaMalloc((void **)&d_data2d, sizeof(float *) * rows);
	for (int i = 0; i < rows; i++)
	{
		h_data2d[i] = new float[cols]; // 主机端一维指针
		for (int j = 0; j < cols; j++)
		{
			h_data2d[i][j] = i + j;
		}

		// float *d_data1d;
		cudaMalloc((void **)&t_data2d[i], sizeof(float) * cols); // 设备端一维指针
		// 通过一维指针把一维数组拷贝到设备端
		cudaMemcpy(t_data2d[i], h_data2d[i], sizeof(float) * cols, cudaMemcpyHostToDevice);
	}
	// 把主机端二维指针指向拷贝到设备端,这样设备端的二维指针就指向了设备端的一维指针
	cudaMemcpy(d_data2d, t_data2d, sizeof(float *) * rows, cudaMemcpyHostToDevice);

	dim3 threads(rows, cols);
	printf("threads.x:%d,threads.y:%d\n", threads.x, threads.y);
	testKernel<<<1, threads>>>(d_data2d);
	cudaDeviceSynchronize();
	// 传回主机端
	for (int i = 0; i < rows; i++)
	{
		cudaMemcpy(h_data2d[i], t_data2d[i], sizeof(float) * cols, cudaMemcpyDeviceToHost);
	}
	cudaMemcpy(h_data2d, t_data2d, sizeof(float *) * rows, cudaMemcpyDeviceToHost);

	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			printf("%f ", h_data2d[i][j]);
		}
		printf("\n");
	}

	// 释放内存
	for (int i = 0; i < rows; i++)
	{
		cudaFree(t_data2d[i]);
		delete[] h_data2d[i];
	}
	delete[] h_data2d;
	delete[] t_data2d;
	cudaFree(d_data2d);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值