CUDA与二维动态数组

二维数组动态申请内存空间,及其与显存数据相互拷贝的两种方式如下:

/*
* Copyright 徐洪志(西北农林科技大学.信息工程学院).  All rights reserved.
* Data: 2012-4-22
*/
//
// 此程序是演示了二维动态数组空间申请和与显存数据相互拷贝的两种方法
#include <stdio.h>
#include <cutil_inline.h>
#include <iostream>
using namespace std;

int main(int argc, char **argv)
{
	CUT_DEVICE_INIT(argc, argv);  // 启动 CUDA
#if 1
	// 方法1.逐行拷贝
	float **CPU_ORIGN, **CPU_RET;  // host端原数据、拷贝回数据
	float **GPU;                   // device端数据
	int width = 5, height = 3;  // 数组的宽度和高度
	size_t size = sizeof(float)*width; // 数据的宽度in bytes
	int row, col;

	// 申请内存空间, 并初始化
	CPU_ORIGN = new float*[height];
	CPU_RET = new float*[height];
	for(row = 0; row < height; ++row)
	{
		CPU_ORIGN[row] = new float[width];
		CPU_RET[row] = new float[width];
		// 初始化数据
		for(col = 0; col < width; ++col)
		{
			CPU_ORIGN[row][col] = (float)(row + col);
			CPU_RET[row][col] = 0.0f;
		}
	}

	// 申请显存空间并初始化
	GPU = new float*[height];
	for(row = 0; row < height; ++row)
	{
		cutilSafeCall( cudaMalloc((void**)&GPU[row], size));
		cutilSafeCall( cudaMemset(GPU[row], 0, size));
	}

	// 将host端原数据拷贝到device端
	for(row = 0; row < height; ++row)
		cutilSafeCall(cudaMemcpy(GPU[row], CPU_ORIGN[row], size, cudaMemcpyHostToDevice));
	
	// 将device端数据拷贝到host端返回数据
	for(row = 0; row < height; ++row)
		cutilSafeCall(cudaMemcpy(CPU_RET[row], GPU[row], size, cudaMemcpyDeviceToHost));

	// 打印host端返回数据
	for(row = 0; row < height; ++row)
	{
		for(col = 0; col < width; ++col)
			cout << CPU_RET[row][col] << " ";
		cout << endl;
	}
	// 释放内存和显存空间
	free(CPU_ORIGN);
	free(CPU_RET);
	for(row = 0; row < height; ++row)
		cutilSafeCall(cudaFree(GPU[row]));
#endif
#if 0
	// 方法2.整体拷贝
	float **CPU_ORIGN, **CPU_RET;  // host端原数据、拷贝回数据
	float **GPU;                   // device端数据
	int width = 5, height = 3;         // 数组的宽度和高度
	size_t size = sizeof(float)*width; // 数据的宽度in bytes
	size_t pitch;
	int row, col;

	// 申请内存空间, 并初始化
	CPU_ORIGN = new float*[height];
	CPU_RET = new float*[height];
	for(row = 0; row < height; ++row)
	{
		CPU_ORIGN[row] = new float[width];
		CPU_RET[row] = new float[width];
		// 初始化数据
		for(col = 0; col < width; ++col)
		{
			CPU_ORIGN[row][col] = (float)(row + col);
			CPU_RET[row][col] = 0.0f;
		}
	}

	// 申请显存空间并初始化
	cutilSafeCall(cudaMallocPitch((void**)&GPU, &pitch, size, height));
	cutilSafeCall(cudaMemset2D(GPU, pitch, 0, size, height));

	// 将host端原数据拷贝到device端
	cutilSafeCall(cudaMemcpy2D(GPU, pitch, CPU_ORIGN, size, size, height, cudaMemcpyHostToDevice));

	// 将device端数据拷贝到host端返回数据
	cutilSafeCall(cudaMemcpy2D(CPU_RET, size, GPU, pitch, size, height, cudaMemcpyDeviceToHost));

	// 打印host端返回数据
	for(row = 0; row < height; ++row)
	{
		for(col = 0; col < width; ++col)
			cout << CPU_RET[row][col] << " ";
		cout << endl;
	}
	// 释放内存和显存空间
	free(CPU_ORIGN);
	free(CPU_RET);
	cutilSafeCall(cudaFree(GPU));
#endif
	CUT_EXIT(argc, argv);  // 退出CUDA
}


  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值