CUDA可以认为是一个由软件和硬件构成的并行计算系统,其依赖于GPU的并行计算单元,CUDA有类C的API,方便程序编写。其依赖于CPU和GPU的异构体系,通过在CPU上串行执行环境初始化、内存分配、数据传输,然后在GPU上执行并行计算。

内存分配

  1、一维

int *dev_ans = ;
cudaMalloc((void**)&dev_ans, d.y * sizeof(int));

  参数1:显存中开辟的空间的指针(术语:GPU设备端数据指针)

  参数2:空间大小,字节为单位

  2、二维

int *dev_mat = ;
int pitch;
cudaMallocPitch((void**)&dev_mat, (size_t *)&pitch, d.x * sizeof(int), d.y);

  参数1:GPU设备端数据指针

  参数2:一行数据的真实空间大小(字节)【此参数是获取返回值】,GPU中从256字节对齐的地址(address=0,256,512……)连续访问最有效率,故每行实际分配的大小要大于需要分配的大小

  参数3:每行需要分配的空间大小

  参数4:矩阵行数

内存拷贝

  1、一维

cudaMemcpy(ans, dev_ans, d.y * sizeof(int), cudaMemcpyDeviceToHost);

  参数1:目标数据地址

  参数2:源数据地址

  参数3:数据大小

  参数4:拷贝类型(主机至主机,主机至设备,设备至主机,设备至设备)

  2、二维

cudaMemcpy2D(dev_mat, pitch, mat, d.x*sizeof(int), d.x*sizeof(int), d.y, cudaMemcpyHostToDevice);

  参数1:目标数据地址

  参数2:pitch,分配空间的行宽(字节单位)

  参数3:源数据地址

  参数4:pitch,分配空间的行宽(字节单位)

  参数5:需要拷贝数据的真实行宽(字节单位)

  参数6:数据的行数(非字节单位哦!)

  参数7:数据拷贝类型

  注:pitch是线性存储空间的行宽不是数据的行宽,在设备端 pitch大于等于数据行宽,在主机端pitch==数据行宽。

内存访问

  主机中的内存访问就是c++的访存没什么好说的,现在看看显存中的访问方式(也就是在kernel中的访存)。

__global__ void addKernel(int *mat, int *ans, size_t pitch)
{
int bid = blockIdx.x;
int tid = threadIdx.x;
__shared__ int data[];
int *row = (int*)((char*)mat + bid*pitch);
data[tid] = row[tid];
__syncthreads();
for (int i = ; i > ; i /= ) {
if (tid < i)
data[tid] = data[tid] + data[tid + i];
__syncthreads();
}
if (tid == )
ans[bid] = data[];
}

  一维:

    ans[index]直接访问

  二维:

    先计算访问的行的初始地址 int *row = (int*)((char*)mat + bid*pitch)

    然后访问此行的对应元素 row[index]

内存释放

cudaFree(dev_mat)

  

CUDA -- 内存分配的更多相关文章

  1. CUDA线性内存分配

    原文链接 概述:线性存储器可以通过cudaMalloc().cudaMallocPitch()和cudaMalloc3D()分配 1.1D线性内存分配 1 cudaMalloc(void**,int) ...

  2. 共享CUDA内存

    共享CUDA内存 进程间共享 此功能仅限于Linux. 将设备阵列导出到另一个进程 使用CUDA IPC API,可以与同一台计算机上的另一个进程共享设备阵列.为此,请使用.get_ipc_handl ...

  3. CUDA 内存统一分析

    CUDA 内存统一分析 关于CUDA 编程的基本知识,如何编写一个简单的程序,在内存中分配两个可供 GPU 访问的数字数组,然后将它们加在 GPU 上. 本文介绍内存统一,这使得分配和访问系统中任何处 ...

  4. 《深入理解Java虚拟机》内存分配策略

    上节学习回顾 1.判断对象存活算法:引用计数法和可行性分析算法 2.垃圾收集算法:标记-清除算法.复制算法.标记-整理算法 3.垃圾收集器: Serial:新生代收集器,采用复制算法,单线程. Par ...

  5. Java的内存分配

    java内存分配 A:栈 存储局部变量 B:堆 存储所有new出来的 C:方法区(方法区的内存中) 类加载时 方法信息保存在一块称为方法区的内存中, 并不随你创建对象而随对象保存于堆中; D:本地方法 ...

  6. C语言内存分配方法。

    当C程序运行在操作系统上时,操作系统会给每一个程序分配一定的栈空间. 堆为所有程序共有的,需要时需要申请访问. 一.栈 局部变量.函数一般在栈空间中. 运行时自动分配&自动回收:栈是自动管理的 ...

  7. JVM内存分配策略

    在 JVM内存垃圾回收方法 中,我们已经详细讨论了内存回收,但是,我们程序中生成的对象是如何进行分配的呢?以下所述针对的是HotSpot虚拟机. 1.Java堆结构 以HotSpot为例,如下图: H ...

  8. Java的垃圾回收和内存分配策略

    本文是<深入理解Java虚拟机 JVM高级特性与最佳实践>的读书笔记 在介绍Java的垃圾回收方法之前,我们先来了解一下Java虚拟机在执行Java程序的过程中把它管理的内存划分为若干个不 ...

  9. Buddy内存分配算法

    Buddy(伙伴的定义): 这里给出伙伴的概念,满足以下三个条件的称为伙伴:1)两个块大小相同:2)两个块地址连续:3)两个块必须是同一个大块中分离出来的: Buddy算法的优缺点: 1)尽管伙伴内存 ...

随机推荐

  1. 转载 could not find a getter for ... in class ... 异常的原因解析

    可能原因如下: 1.真的没有写getter方法(发生几率:1%) 2.*.hmb.xml文件中的属性名和pojo不一致(*.hbm.xml和*.java没衔接好,不一致),字段属性没有正确配置,比如, ...

  2. 并发编程~~~多线程~~~计算密集型 / IO密集型的效率, 多线程实现socket通信

    一 验证计算密集型 / IO密集型的效率 IO密集型: IO密集型: 单个进程的多线程的并发效率高. 计算密集型: 计算密集型: 多进程的并发并行效率高. 二 多线程实现socket通信 服务器端: ...

  3. 【Excel】对比两列值

  4. 第05组 Beta冲刺(4/4)

    第05组 Beta冲刺(4/4) 队名:天码行空 组长博客连接 作业博客连接 团队燃尽图(共享): GitHub当日代码/文档签入记录展示(共享): 组员情况: 组员1:卢欢(组长) 过去两天完成了哪 ...

  5. 完美解决MacOS catalina 升级后Vmware黑屏的问题

    完美解决MacOS catalina 升级后VMware黑屏 1.关闭MacOS的rootless机制 #Rootless机制将成为对抗恶意程序的最后防线 1.尝试关闭Rootless,重启按住 Co ...

  6. python笔记:配置虚拟开发环境

    问题 有的时候开发不同的业务,所需要的环境不一样.一直在同一个环境中开发时候,不同的包版本升级可能会导致另外的业务不能正常工作.另外,有的github上的项目需要的开发环境与你使用的环境不同,冒然的按 ...

  7. MNIST 例程源码分析 TensorFlow 从入门到精通

    按照上节步骤, TensorFlow 默认安装在 /usr/lib/python/site-packages/tensorflow/ (也有可能是 /usr/local/lib……)下,查看目录结构: ...

  8. 21个Java Collections面试问答

    Java Collections框架是Java编程语言的核心API之一. 这是Java面试问题的重要主题之一.在这里,我列出了一些重要的Java集合面试问题和解答,以帮助您进行面试.这直接来自我14年 ...

  9. Flink on Yarn的两种模式及HA

    转自:https://blog.csdn.net/a_drjiaoda/article/details/88203323 Flink on Yarn模式部署始末:Flink的Standalone和on ...

  10. Java-100天知识进阶-Java内存-知识铺(四)

    知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停的来唤醒你记忆深处的知识点. 1.Java内存模型是每个java程序员必须掌握理解的 2.Java内存模型的主要目标 ...