【转】CUDA与二维动态数组

  1 /*
  2 * Copyright 徐洪志(西北农林科技大学.信息工程学院).  All rights reserved.
  3 * Data: 2012-4-22
  4 */
  5 //
  6 // 此程序是演示了二维动态数组空间申请和与显存数据相互拷贝的两种方法
  7 #include <stdio.h>
  8 //#include <cutil_inline.h>
  9 #include <iostream>
 10 #include <cuda_runtime.h>
 11 //#include <cutil.h>
 12 using namespace std;
 13
 14 int main(int argc, char **argv)
 15 {
 16
 17     //CUT_DEVICE_INIT(argc, argv);  // 启动 CUDA
 18 #if 1
 19     // 方法1.逐行拷贝
 20     float **CPU_ORIGN, **CPU_RET;  // host端原数据、拷贝回数据
 21     float **GPU;                   // device端数据
 22     int width = 5, height = 3;  // 数组的宽度和高度
 23     size_t size = sizeof(float)*width; // 数据的宽度in bytes
 24     int row, col;
 25
 26     // 申请内存空间, 并初始化
 27     CPU_ORIGN = new float*[height];
 28     CPU_RET = new float*[height];
 29     for(row = 0; row < height; ++row)
 30     {
 31         CPU_ORIGN[row] = new float[width];
 32         CPU_RET[row] = new float[width];
 33         // 初始化数据
 34         for(col = 0; col < width; ++col)
 35         {
 36             CPU_ORIGN[row][col] = (float)(row + col);
 37             CPU_RET[row][col] = 0.0f;
 38         }
 39     }
 40
 41     // 申请显存空间并初始化
 42     GPU = new float*[height];
 43     for(row = 0; row < height; ++row)
 44     {
 45           ( cudaMalloc((void**)&GPU[row], size));
 46           ( cudaMemset(GPU[row], 0, size));
 47     }
 48
 49     // 将host端原数据拷贝到device端
 50     for(row = 0; row < height; ++row)
 51           (cudaMemcpy(GPU[row], CPU_ORIGN[row], size, cudaMemcpyHostToDevice));
 52
 53     // 将device端数据拷贝到host端返回数据
 54     for(row = 0; row < height; ++row)
 55           (cudaMemcpy(CPU_RET[row], GPU[row], size, cudaMemcpyDeviceToHost));
 56
 57     // 打印host端返回数据
 58     for(row = 0; row < height; ++row)
 59     {
 60         for(col = 0; col < width; ++col)
 61             cout << CPU_RET[row][col] << " ";
 62         cout << endl;
 63     }
 64     // 释放内存和显存空间
 65     free(CPU_ORIGN);
 66     free(CPU_RET);
 67     for(row = 0; row < height; ++row)
 68           (cudaFree(GPU[row]));
 69 #endif
 70
 71
 72 #if 0
 73     // 方法2.整体拷贝
 74     float **CPU_ORIGN, **CPU_RET;  // host端原数据、拷贝回数据
 75     float **GPU;                   // device端数据
 76     int width = 5, height = 3;         // 数组的宽度和高度
 77     size_t size = sizeof(float)*width; // 数据的宽度in bytes
 78     size_t pitch;
 79     int row, col;
 80
 81     // 申请内存空间, 并初始化
 82     CPU_ORIGN = new float*[height];
 83     CPU_RET = new float*[height];
 84     for(row = 0; row < height; ++row)
 85     {
 86         CPU_ORIGN[row] = new float[width];
 87         CPU_RET[row] = new float[width];
 88         // 初始化数据
 89         for(col = 0; col < width; ++col)
 90         {
 91             CPU_ORIGN[row][col] = (float)(row + col);
 92             CPU_RET[row][col] = 0.0f;
 93         }
 94     }
 95
 96     // 申请显存空间并初始化
 97       (cudaMallocPitch((void**)&GPU, &pitch, size, height));
 98       (cudaMemset2D(GPU, pitch, 0, size, height));
 99
100     // 将host端原数据拷贝到device端
101       (cudaMemcpy2D(GPU, pitch, CPU_ORIGN, size, size, height, cudaMemcpyHostToDevice));
102
103     // 将device端数据拷贝到host端返回数据
104       (cudaMemcpy2D(CPU_RET, size, GPU, pitch, size, height, cudaMemcpyDeviceToHost));
105
106     // 打印host端返回数据
107     for(row = 0; row < height; ++row)
108     {
109         for(col = 0; col < width; ++col)
110             cout << CPU_RET[row][col] << " ";
111         cout << endl;
112     }
113     // 释放内存和显存空间
114     free(CPU_ORIGN);
115     free(CPU_RET);
116       (cudaFree(GPU));
117 #endif
118       system("pause");
119     //CUT_EXIT(argc, argv);  // 退出CUDA
120 }

http://blog.csdn.net/xhz1234/article/details/7487767

时间: 2024-10-13 10:59:17

【转】CUDA与二维动态数组的相关文章

一维动态数组和二维动态数组的创建和使用

#include<stdio.h> #include<malloc.h> void main(){ int *a,n=10,i; /* calloc()函数的原型是:(void *)calloc(unsigned n,unsigned size) calloc()函数用于向系统动态申请n个,每个占sizege字节的内存单元,函数返回值为所申请的内存空间首地址 malloc和calloc主要区别在于,当系统的内存只剩下一些非常小的碎片时,用calloc函数设计的动态数组的时间效率优于

二维动态数组

之前都是写的小程序,一直用的静态数组,也没出现问题. 可是,最近碰到大型程序和工程,这时就要用动态数组了. 因为静态数组时保存在栈中的,而动态数组保存在堆中. 计算机的栈只有1M大小,而堆可以理论上达到计算机内存大小, 可见当大型工程数据量非常大时,必须使用动态数组了. c++的动态数组的建立和删除要用到new和delete, new用来开辟内存空间,delete用来删除内存空间. 建立二维动态数组test,第一维大小为a,第二维大小为b. 下面时具体实现代码: 1 int **test=new

二维数组指针及二维动态数组的分配问题

在我以前的文章中都有讲过关于数组指针及指针数组的相关问题,但是讲得不够深入,我后来后了别人写的博客后觉得人家的确实写得好, 也学到了不少东西,对以前的问题有深的领悟了,于是准备结合这些博客和文章再稍微深入一点讲讲这些问题.这些指针的问题是C语言中的基础与关键 而且一旦出现这些问题,不太好找bug的来源,有时候不得不借助反汇编. 参考文章: http://c.biancheng.net/cpp/html/476.html       C语言指针数组和数组指针 http://blog.csdn.ne

c++创建二维动态数组与内存释放

如下: #include <iostream> #include <windows.h> using namespace std; int main() { cout << "create dynamic two-dimension array..." << endl; int sizeX = 5; int sizeY = 8; // 申请 double** array = new double*[sizeX]; for (int i =

二维循环数组

一.题目与要求 题目.返回一个二维整数数组中最大子数组的和 要求.1.输入一个二维整形数组,数组里有正数也有负数. 2.二维数组首尾相接,象个一条首尾相接带子一样. 3.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和 二.设计思路 在上一次的以为循环数组的基础上,和二维数组求最大子数组相结合,将功能合并,完成题目要求. 第一步.将每一行的数组作为循环数组求最大子数组 第二步.通过枚举的方式,将每一种情况的和存入到新建二维数组中 第三部.通过逐列计算最大子数组的方法求所有子矩阵的最

结对开发之返回一个二维整数数组中最大联通子数组的和

一.题目要求 输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.解题思路 先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果. 三.程序代码 2 #include<iostream.h> 3 int main(int argc, char* argv[]

返回一个二维整数数组中最大联通子数组的和

题目: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选).源代码.结果截图.总结. 思想: 在看到本题目后,想了很久也没有想到比较满意的解决方法,觉得题目比较难,超出了我的能力范围.不过,个人认为可能用到了图论的知识,但是学的不好.根据上图给定的二维数组求解最大联通数组也许比较简单.以一个非负

返回一个二维整数数组中最大联通子数组的和6

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 #include<ios

返回一个首尾相接的二维整数数组中最大子数组的和

一.题目:返回一个二维整数数组中最大子数组的和. 二.要求: (1)输入一个二维整形数组,数组里有正数也有负数. (2)二维数组首尾相接,象个一条首尾相接带子一样. (3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (4)求所有子数组的和的最大值. 三.解题思路: 将两个同样的数组首尾相接合并成一个数组,在用以前求二维数组最大子数组的方法求解 四.源代码: #include<iostream> using namespace std; #include"math