#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;
}
将二维指针传入gpu,并可以通过指针调用一维指针的数据
最新推荐文章于 2024-09-27 14:28:55 发布
本文展示了如何在CUDA环境中,通过一维指针数组模拟二维数组,将数据从主机传输到设备(GPU),在核函数中进行操作,然后返回主机。主要步骤包括主机端和设备端的一维数组内存分配、数据拷贝以及指针的传递。
摘要由CSDN通过智能技术生成