首先看下我们在CPU上是如何用二级指针表示二维数组的,其实就两点:一是用一级指针保存数据,二是用二级指针去按行索引数据位置。关于一级指针和二级指针的内存分配这里不讲了,注意数据类型就可以了。

代码做了相关说明,应该比较好理解:

#define Row  8
#define Col 4
//声明Row个行指针: cpuA cpuA+0  cpuA+1 cpuA+Rowint **cpuA = (int **)malloc(Row * sizeof(int*));int *cpudataA = (int*)malloc(Row*Col * sizeof(int));//cpuA[i] 看作行指针for (int i = 0; i < Row; i++) {cpuA[i] = cpudataA + Col*i;}//数据赋值for (int i = 0; i < Row*Col; i++) {cpudataA[i] = i;}//按照二维数组形式索引数据for (int i = 0; i < Row; i++) {for (int j = 0; j < Col; j++) {printf("%5d", cpuA[i][j]);}printf("\n");}

然后对应我们在GPU上使用二级指针,整体上其实和CPU没有多大区别,把二级指针和一级指针保存的数据 传送到设备上去,然后在设备上建立二级指针和一级指针的对应关系。目的就是让二级指针能够指到对应的数据位置。
这里简单了画了个示意图:

GPU代码如下:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"#include <stdio.h>
#include <math.h>
#define Row  8
#define Col 4__global__ void addKernel(int **C,  int **A)
{int idx = threadIdx.x + blockDim.x * blockIdx.x;int idy = threadIdx.y + blockDim.y * blockIdx.y;if (idx < Col && idy < Row) {C[idy][idx] = A[idy][idx] + 10;}
}int main()
{int **A = (int **)malloc(sizeof(int*) * Row);int **C = (int **)malloc(sizeof(int*) * Row);int *dataA = (int *)malloc(sizeof(int) * Row * Col);int *dataC = (int *)malloc(sizeof(int) * Row * Col);int **d_A;int **d_C;int *d_dataA;int *d_dataC;//malloc device memorycudaMalloc((void**)&d_A, sizeof(int **) * Row);cudaMalloc((void**)&d_C, sizeof(int **) * Row);cudaMalloc((void**)&d_dataA, sizeof(int) *Row*Col);cudaMalloc((void**)&d_dataC, sizeof(int) *Row*Col);//set valuefor (int i = 0; i < Row*Col; i++) {dataA[i] = i+1;}//将主机指针A指向设备数据位置,目的是让设备二级指针能够指向设备数据一级指针//A 和  dataA 都传到了设备上,但是二者还没有建立对应关系for (int i = 0; i < Row; i++) {A[i] = d_dataA + Col * i;C[i] = d_dataC + Col * i;}cudaMemcpy(d_A, A, sizeof(int*) * Row, cudaMemcpyHostToDevice);cudaMemcpy(d_C, C, sizeof(int*) * Row, cudaMemcpyHostToDevice);cudaMemcpy(d_dataA, dataA, sizeof(int) * Row * Col, cudaMemcpyHostToDevice);dim3 threadPerBlock(4, 4);dim3 blockNumber( (Col + threadPerBlock.x - 1)/ threadPerBlock.x, (Row + threadPerBlock.y - 1) / threadPerBlock.y );printf("Block(%d,%d)   Grid(%d,%d).\n", threadPerBlock.x, threadPerBlock.y, blockNumber.x, blockNumber.y);addKernel << <blockNumber, threadPerBlock >> > (d_C, d_A);//拷贝计算数据-一级数据指针cudaMemcpy(dataC, d_dataC, sizeof(int) * Row * Col, cudaMemcpyDeviceToHost);for (int i = 0; i < Row*Col; i++) {if (i%Col == 0) {printf("\n");}printf("%5d", dataC[i]);}printf("\n");}

实验结果:

使用二级指针改变二维数组中的元素值

直接上码:

#include <stdio.h>void modifyElement(int **p)
{**p = 1;
}int main(void)
{int a[2][3] = {0, 0, 0, 0, 0, 0};int i = 0;int j = 0;int *p = (int *)&a[0][0];printf("Before modify: \n");for(i = 0; i < 2; i++){for(j = 0; j < 3; j++){printf("a[%d][%d] = %d ", i, j, a[j] );}}printf("\n");modifyElement((int **)&p);printf("After modify: \n");for(i = 0; i < 2; i++){for(j = 0; j < 3; j++){printf("a[%d][%d] = %d ", i, j, a[j] );}}printf("\n");return 0;
}

运行结果:

Before modify:
a[0][0] = 0 a[0][1] = 0 a[0][2] = 0 a[1][0] = 0 a[1][1] = 0 a[1][2] = 0
After modify:
a[0][0] = 1 a[0][1] = 0 a[0][2] = 0 a[1][0] = 0 a[1][1] = 0 a[1][2] = 0

CUDA中二级指针表示二级数组相关推荐

  1. C语言:结构体中一级指针和二级指针的创建与释放示例

    http://blog.csdn.net/Bixiwen_liu/article/details/53610952 这几天把C语言巩固了一下,作为一门最基本的编程语言,C语言还是相当基础和非常重要的, ...

  2. C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)

    一级指针 int *p;            //表示定义一个int型(4字节)的指针p &p                 //表示p自身的地址位置 p                  ...

  3. C语言中的指针以及二级指针

    很多初学者都对C中的指针很迷糊,希望这篇blog能帮助到大家: 1.什么是"指针": 在执行C程序的时候,由于我们的数据是存储在内存中的.所以对于C程序本身来说,如果想找到相应被调 ...

  4. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 抽象业务逻辑函数 )

    文章目录 一.二级指针排序 ( 抽象业务逻辑函数 ) 1.生成 二级指针 函数 2.打印 二维指针 函数 3.二维指针排序 函数 4.释放 二维指针 函数 二.完整代码示例 一.二级指针排序 ( 抽象 ...

  5. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 通过 交换指针指向的内存数据 方式进行排序 )

    文章目录 一.二维指针 排序 ( 通过 交换指针指向的内存数据 方式进行排序 ) 二.完整代码示例 一.二维指针 排序 ( 通过 交换指针指向的内存数据 方式进行排序 ) 在上一篇博客 [C 语言]二 ...

  6. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针 排序 | 通过 交换指针方式 进行排序 )

    文章目录 一.二维指针 排序 ( 通过 交换指针方式 进行排序 ) 二.完整代码示例 一.二维指针 排序 ( 通过 交换指针方式 进行排序 ) 在上一篇博客 [C 语言]二级指针作为输入 ( 二维指针 ...

  7. C++/C中 sizeof(指针)和sizeof(数组名)的区别

    1.sizeof(array)/sizeof(int)的含义 array是个数组 sizeof (array)就是这个数组所占的内存总量(字节数), sizeof(int)就是单个所占的内存. 所以呢 ...

  8. 一级指针,二级指针,指向数组的指针

    对"black,green,yellow,pin,red"几个单词排序 01 #include <iostream.h> #include <string.h&g ...

  9. C/C++二级指针概念及应用(有向图的邻接表(拓扑排序)、有向网图的邻接表、树的孩子表示)

    目录 一.概述 例1: 例2: 代码: 二.实例 1.有向图的邻接表(拓扑排序) 2.有向网图的邻接表 3.树的孩子表示 一.概述 二级指针:指向指针的指针.一般需要修改地址的时候会用到二级指针. 注 ...

最新文章

  1. 动态规划之等差递减区间个数
  2. 循环首次适应算法_面向6G的极化编码链路自适应技术
  3. u盘排序软件_华硕电脑u盘启动设置
  4. servlet的注解开发
  5. python遥感数据有偿处理_利用python读写tiff遥感影像数据
  6. 手写 Promise.all
  7. 手写一些js方法收集:
  8. android通过Canvas和Paint截取无锯齿圆形图片
  9. 水域大小 Java_我的世界:Java版开发者们畅聊水域更新
  10. 什么是MySQL索引?
  11. 关于Unity资源包导入项目后版本不匹配问题
  12. Vue--基础模板语法以及计算属性
  13. 什么是指令集架构ISA【从处理器谈起】
  14. 锁相环倍频原理简要分析
  15. web服务器攻击与防御系统设计,网络安全-Web的入侵防御系统的设计与实现
  16. java 选项卡放左边_java-JTabbedPane:选项卡位置设置为LEFT但图标...
  17. 【报告分享】2021快手内容生态半年报-快手(附下载)
  18. 字符串前面加f是什么意思?
  19. Runtime.getRuntime().availableProcessors()
  20. 用友ORACLE笔记

热门文章

  1. 常用设计模式——创建型
  2. 31. Next Permutation (java 字典序生成下一个排列)
  3. Partition List -- LeetCode
  4. @property (nonatomic,retain)中的nonatom和retain是什么意思
  5. 计算机导航医学应用,【2016年】计算机导航在全膝关节置换中的应用技术及进展【临床医学论文】.doc...
  6. java实现rabbitmq动态路由/话题模型(topic queues), 生产者 消费者 交换机 消息队列
  7. JavaScript创建对象:深入理解编程原理
  8. 树莓派+docker+tensorflow
  9. 教你搭建一个NAT实验环境
  10. 热门用户推荐能否支持分类筛选?