一段代码搞懂 gpu memory

一段代码搞懂 gpu memory

GPU 的 memory 分为 三种,io速度从快到慢排序为:

  • local memory
  • shared memory
  • global memory

其中 shared memory 的io 速度是远快于 global memory 的。

这三种 memory 的访问性质是:

  • local memory: 线程私有,只能本线程访问
  • shared memory: 线程块(thread block) 共享, 同一个线程块中的线程可以访问。
  • global memory: 所有线程都可访问。

那么在编程的过程中,这三种 memory 是从什么地方体现出来的呢?

#include <stdio.h>

__global__ void memory_demo(float* array)
{
    // array 指针是在 local memory 上的,但是它指向的 memory 是 global memory
    // i, index 都是 local variable,每个 线程 私有。
    int i, index = threadIdx.x;

    // __shared__ variable 对 block 中的 线程可见
    // 并 和 thread block 有相同的 生命周期。
    __shared__ float sh_arr[128];

    // 将 global memory 的值 拷贝到 shared memory 上。
    sh_arr[index] = array[index];

    // barrier here
    __syncthreads();
    // 之后对 shared memory 的 IO 要快的多
    // do something
}

int main()
{
    float h_arr[128];
    float *d_arr;

    // cudaMalloc 分配的 memory 是在 global memory 上的。
    cudaMalloc((void **)&d_arr, sizeof(float)*128);
    cudaMemcpy((void*) d_arr, (void*) h_arr, sizeof(float)*128, cudaMemcpyHostToDevice);

    // 启动 kernel
    memory_demo<<<1, 128>>>(d_arr);

    // .. do other stuff
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小二的折腾日记

day5(面向对象2)

缓冲区的出现是为了提高流的操作效率而出现的。所以在创建缓冲区之前,必须要先有流对象。 为了 提高字符写入流效率,加入了缓冲技术,只要将需要提高效率的流对象作为参...

362
来自专栏林冠宏的技术文章

java 线程 Thread 使用介绍,包含wait(),notifyAll() 等函数使用介绍

(原创,转载请说明出处!谢谢--https://cloud.tencent.com/developer/user/1148436/activities)  此文...

1817
来自专栏菩提树下的杨过

java一些常用并发工具示例

最近把《java并发编程实战》-Java Consurrency in Practice 重温了一遍,把书中提到的一些常用工具记录于此: 一、闭锁(门栓)- C...

1817
来自专栏Spark学习技巧

JAVA集合框架中的常用集合及其特点、适用场景、实现原理简介

813
来自专栏对角另一面

lodash源码分析之缓存方式的选择

每个人心里都有一团火,路过的人只看到烟。 ——《至爱梵高·星空之谜》 本文为读 lodash 源码的第八篇,后续文章会更新到这个仓库中,欢迎 star:po...

3179
来自专栏陈树义

Java并发编程:synchronized

Java并发编程:synchronized   虽然多线程编程极大地提高了效率,但是也会带来一定的隐患。比如说两个线程同时往一个数据库表中插入不重复的数据,就可...

3324
来自专栏JMCui

多线程编程学习三(线程间通信).

一、概要 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就是成为整体的必用方案之一。可以说,使线程进行通信后,系统...

2604
来自专栏栗霖积跬步之旅

java多线程编程核心技术——第二章总结

第一节synchronized同步方法目录 1.1方法内的变量为线程安全的 1.2实例变量非线程安全 1.3多个对象多个锁 1.4synch...

18310
来自专栏Java成长之路

volatile变量详解

关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制,但是它并不容易完全被正确、 完整地理解,以至于许多程序员都习惯不去使用它,遇到需要处理多线...

712
来自专栏Brian

Python 多线程的同步方法

---- 概述 这篇博客是我翻译Python threads synchronization: Locks, RLocks, Semaphores, Condi...

3996

扫码关注云+社区