CUDA 对比三种在GPU上建立三维数组的方式的时间效率(更新)

对比三两种在GPU上建立三维数组的方式
直接在GPU建立全局变量三维数组
在CPU端为GPU上的三维数组开辟空间
在CPU端为GPU上的一维数组开辟空间,然后通过寻址的方式

代码:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>
#include <stdio.h>
#include <time.h>
using namespace std;

__device__ const int n = 6000;
__device__ const int m = 100;
__device__ double d_static[n][m][10];


__global__ void dynamic_cpu(double ***f_3);
__global__ void static_gpu();
__global__ void dynamic_one_gpu(double *a);


const int N = 6000;
const int M = 100;

clock_t a, b;
double t;
int main()
{
	double *arr;
	cudaMalloc((void**)(&arr), N*M * 10 * sizeof(double));
	
	double ***f_3 = (double***)malloc(N * sizeof(double***));
	double **f_2 = (double**)malloc(N * M * sizeof(double**));
	double *f_1 = (double*)malloc(N * M * 10 * sizeof(double*));

	double ***d_3;
	cudaMalloc((void**)(&d_3), N * sizeof(double***));
	double **d_2;
	cudaMalloc((void**)(&d_2), N*M * sizeof(double**));
	double *d_1;
	cudaMalloc((void**)(&d_1), N*M * 10 * sizeof(double));

	for (int i = 0; i < N*M * 10; i++)
	{
		f_1[i] = 0;
	}
	cudaMemcpy(d_1, f_1, N*M * 10 * sizeof(double), cudaMemcpyHostToDevice);
	cudaMemcpy(arr, f_1, N*M * 10 * sizeof(double), cudaMemcpyHostToDevice);
	for (int i = 0; i < N*M; i++)
	{
		f_2[i] = d_1 + i * 10;
	}
	cudaMemcpy(d_2, f_2, N*M * sizeof(double**), cudaMemcpyHostToDevice);
	for (int i = 0; i < N; i++)
	{
		f_3[i] = d_2 + M * i;
	}
	cudaMemcpy(d_3, f_3, N * sizeof(double***), cudaMemcpyHostToDevice);

	int dimx = 6;
	int dimy = 10;
	dim3 block(dimx, dimy);
	dim3 grid((N + block.x - 1) / block.x, (M + block.y - 1) / block.y);

	a = clock();
	for (int i = 0; i < 1000; i++)
	{
		static_gpu << <grid, block >> > ();

	}
	cudaDeviceSynchronize();
	b = clock();
	t = (double)(b - a) / CLOCKS_PER_SEC;
	cout << "static_gpu=" << t << endl;

	a = clock();
	for (int i = 0; i < 1000; i++)
	{
		dynamic_cpu << <grid, block >> > (d_3);

	}
	cudaDeviceSynchronize();
	b = clock();
	t = (double)(b - a) / CLOCKS_PER_SEC;
	cout << "dynamic_cpu=" << t << endl;

	a = clock();
	for (int i = 0; i < 1000; i++)
	{
		dynamic_one_gpu << <grid, block >> > (arr);

	}
	cudaDeviceSynchronize();
	b = clock();
	t = (double)(b - a) / CLOCKS_PER_SEC;
	cout << "dynamic_one_gpu=" << t << endl;

	return 0;
}

__global__ void static_gpu()
{
	int X = threadIdx.x + blockIdx.x * blockDim.x;
	int Y = threadIdx.y + blockIdx.y * blockDim.y;
	if (X < n&&Y < m)
	{
		for (int i = 0; i < 10; i++)
		{
			d_static[X][Y][i] = (d_static[X][Y][i] + X * 0.2 + Y * 0.3 + i * 0.4) * 0.01;
		}
	}
}
__global__ void dynamic_cpu(double ***f_3)
{
	int X = threadIdx.x + blockIdx.x * blockDim.x;
	int Y = threadIdx.y + blockIdx.y * blockDim.y;
	if (X < n&&Y < m)
	{
		for (int i = 0; i < 10; i++)
		{
			f_3[X][Y][i] = (f_3[X][Y][i] + X * 0.2 + Y * 0.3 + i * 0.4) * 0.01;
		}
	}
}

__global__ void dynamic_one_gpu(double *a)
{
	int X = threadIdx.x + blockIdx.x * blockDim.x;
	int Y = threadIdx.y + blockIdx.y * blockDim.y;
	if (X < n&&Y < m)
	{
		for (int i = 0; i < 10; i++)
		{
			a[10 * (X + Y * N) + i] = (a[10 * (X + Y * N) + i] + X * 0.2 + Y * 0.3 + i * 0.4) * 0.01;
		}
	}
}

执行时间:

static_gpu=21.447
dynamic_cpu=11.669
dynamic_one_gpu=5.52

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GPU上开辟二维数组空间,可以使用CUDA的动态内存分配函数`cudaMalloc()`和`cudaMemcpy()`,具体步骤如下: 1. 定义二维数组的行数和列数,例如: ```c++ int rows = 10; int cols = 20; ``` 2. 在设备端(GPU)上分配二维数组空间,使用`cudaMalloc()`函数,例如: ```c++ float* device_arr; cudaMalloc((void**)&device_arr, rows * cols * sizeof(float)); ``` 这里使用了`cudaMalloc()`函数,分配了一个大小为`rows * cols * sizeof(float)`字节的空间,将指针赋值给`device_arr`。 3. 将主机端(CPU)上的二维数组数据拷贝到设备端(GPU)上的二维数组空间中,使用`cudaMemcpy()`函数,例如: ```c++ float host_arr[rows][cols]; // 初始化 host_arr cudaMemcpy(device_arr, host_arr, rows * cols * sizeof(float), cudaMemcpyHostToDevice); ``` 这里使用了`cudaMemcpy()`函数,将主机端(CPU)上的二维数组`host_arr`拷贝到设备端(GPU)上的二维数组`device_arr`中。 4. 在设备端(GPU)上操作二维数组,例如: ```c++ kernel<<<gridSize, blockSize>>>(device_arr, rows, cols); ``` 这里假设有一个名为`kernel`的CUDA核函数,需要对设备端(GPU)上的二维数组`device_arr`进行操作,传递二维数组的行数和列数作为参数。 5. 在设备端(GPU)上释放二维数组空间,使用`cudaFree()`函数,例如: ```c++ cudaFree(device_arr); ``` 这里使用了`cudaFree()`函数,释放了设备端(GPU)上的二维数组`device_arr`所占用的空间。 需要注意的是,在设备端(GPU)上的二维数组通常是使用一维数组来表示的,可以按照行优先或列优先的方式进行存储,具体实现需要根据具体需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值