基本的cuda共享内存

问题描述 投票:0回答:1

我是cuda的新手并且有一些关于共享内存的问题:

  1. 每个SM在同一个GPU中具有相同数量的共享内存吗?
  2. SM如何在块中划分共享内存?它是否均匀分布(例如,如果有2个块,那么无论实际使用多少,每个块都会获得SM内共享内存的一半),还是基于需求?
  3. 我对共享内存库的理解是:共享内存分为32个同样大的内存库。那么这意味着每个块(即eveyr块有自己的32个库)还是每个SM?
  4. 如果我从多个单词的共享内存中执行CudaMemcpy,这会算作单个事务还是多个事务?这会导致银行冲突吗?

谢谢!

cuda
1个回答
3
投票

首先,我要指出共享内存首先是编程模型的抽象,通过该抽象,硬件的某些特性(快速,片上存储器)被暴露出来。在CUDA编程模型中,网格中的每个块(内核启动)都获得相同数量的共享内存。这取决于内核函数所需的静态分配的共享内存量以及内核启动中指定的任何其他动态共享内存。

  1. 每个SM在同一个GPU中具有相同数量的共享内存吗?

是的,目前就是这种情况。但是,这与您编程CUDA的方式并不相同,因为:

  1. SM如何在块中划分共享内存?它是否均匀分布(例如,如果有2个块,那么无论实际使用多少,每个块都会获得SM内共享内存的一半),还是基于需求?

启动内核时,可以指定每个块需要多少共享内存。然后,这会通知每个多处理器可以容纳多少个块。因此,并不是块的数量定义了每个块获得多少共享内存,反之亦然:每个块所需的共享内存量是定义每个多处理器上可以驻留多少块的因素之一。

您将需要了解延迟隐藏和占用,因为这些是GPU编程时非常基本的主题。有关不同GPU架构的内存子系统的更多详细信息,请查看CUDA Programming Guide

  1. 我对共享内存库的理解是:共享内存分为32个同样大的内存库。那么这意味着每个块(即eveyr块有自己的32个库)还是每个SM?

最后,由于GPU内核的SIMD(SIMT)特性,实际的程序执行发生在warp中。当这样的warp(当前,实际上意味着一组32个线程)执行共享内存访问时,银行冲突将成为问题,因为该指令生成的共享内存请求被提供。没有真正记录是否可以并行提供多个warp的共享内存请求。我的猜测是每个SM只有一个单元来处理共享内存请求,因此答案是否定的。

  1. 如果我从多个单词的共享内存中执行CudaMemcpy,这会算作单个事务还是多个事务?这会导致银行冲突吗?

你不能将cudaMemcpy()变成共享内存。共享内存只能由同一块的设备线程访问,并且只有在该块运行时才会持续存在。

© www.soinside.com 2019 - 2024. All rights reserved.