繁体   English   中英

CUDA:是否可以将所有48KB的片上存储器用作共享存储器?

CUDA: Is It Possible to Use All of 48KB of On-Die Memory As Shared Memory?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在使用Windows 7 64位SP1上的CUDA Toolkit 4.0和Visual Studio 2010 Professional为GTX 580开发CUDA应用程序。 我的程序比典型的CUDA程序更耗费内存,我试图为每个CUDA块分配尽可能多的共享内存。 但是,每次尝试为每个块使用超过32K的共享内存时,程序都会崩溃。

通过阅读官方CUDA文档,我了解到CUDA设备上每个SM有48KB的片上存储器,其计算能力为2.0或更高,而片上存储器在L1缓存和共享存储器之间分配:

相同的片上存储器用于L1和共享存储器,并且可以为每个内核调用配置多少L1和共享存储器(第F.4.1节) http://developer.download.nvidia.com /compute/DevZone/docs/html/C/doc/Fermi_Tuning_Guide.pdf

这让我怀疑在我的程序运行时只有32KB的单内存被分配为共享内存。 因此我的问题是:是否可以将所有48KB的片上内存用作共享内存?

我尝试了我能想到的一切。 我为nvcc指定了选项--ptxas-options =“ - v -dlcm = cg”,我在程序中调用了cudaDeviceSetCacheConfig()和cudaFuncSetCacheConfig(),但没有一个解决了这个问题。 我甚至确保没有寄存器溢出,并且我没有意外地使用本地内存:

1>      24 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
1>  ptxas info    : Used 63 registers, 40000+0 bytes smem, 52 bytes cmem[0], 2540 bytes cmem[2], 8 bytes cmem[14], 72 bytes cmem[16]

虽然我可以使用32KB的共享内存,这已经给了我巨大的性能提升,但我宁愿充分利用所有快速的片上内存。 任何帮助深表感谢。

更新:我在程序崩溃时启动了640个线程。 512给了我比256更好的性能,所以我试图进一步增加线程数。

3 个回复

您的问题与共享内存配置无关,但与您要启动的线程数有关。

每个线程使用63个寄存器并启动640个线程,总共可以提供40320个寄存器。 您的设备的注册总量为32K,因此资源不足。

关于片上存储器在Tom的答案中得到了很好的解释,并且正如他所评论的那样,检查API调用中的错误将有助于您将来的错误。

计算能力2.0及更高版本的设备每个SM具有64KB的片上存储器。 这可配置为16KB L1和48KB涂层或48KB L1和16KB涂层(计算能力3.x上也是32/32)。

您的程序因其他原因而崩溃。 您是否检查所有API调用是否有错误? 你试过cuda-memcheck吗?

如果您使用太多共享内存,那么当您启动内核时说明资源不足时会出现错误。

此外,将参数从主机传递到GPU使用共享内存(最多256个字节),因此您永远不会获得实际的48KB。

1 基于共享存储器的1d模板CUDA实现中的负数组索引

我目前正在使用CUDA编程,我正在尝试从我在网上找到的工作室学习幻灯片,可以在这里找到。 我遇到的问题是幻灯片48 。 可以在那里找到以下代码: 添加一些上下文。 我们有一个名为阵列in其中的长度说N 。 然后,我们有另一个阵列out其长度为N+(2*RADIUS) ,其中RAD ...

2 进程之间共享存储器

我玩弄多道处理模块中的蟒蛇,并试图并行算法,与不同的增量值的每个时间(修改通过列表循环埃拉托色尼的筛算法)。 因此,我想拥有的所有进程之间的共享列表,使所有的过程都修改相同的列表。 我试着用multiprocessing.Array功能,但是当我到达节目结束的阵列仍然不变并仍包含全0(该值初始化我它 ...

3 大规模多线程设计的共享存储器中的缺陷

我正在尝试创建我的第一个多线程应用程序,一个可扩展到多核技术的应用程序。 它的灵感来自事件驱动的尖峰神经网络的概念。 设计有点像这样:算法的数据结构以类的实例的形式存储在存储器中的1个位置。 可以在此结构上执行的任务的示例是神经元尖峰:它将修改神经元和连接的神经元中的若干值,并识别可能 ...

4 共享存储器算术运算指令级并行

在开普勒中,要获得ILP,是否应该将算术运算与共享内存分开? 我不知道它(运算数是共享内存的算术运算)是否分为两个运算,一个运算是从共享内存加载到寄存器,然后在寄存器上进行运算,还是一个运算 因为在“对大型并行多处理器进行编程”一书中,有关数据预取的第6部分说,将数据加载到共享内存中包括 ...

2014-05-06 12:17:18 1 99   cuda
5 Razr i:将外部存储器用作RAM

因此, 我读过一些关于将外部存储器用作Android上实际的闪存的信息,但不确定在Razr i上进行此操作。 我对黑客和技术不甚了解,因此我需要您的帮助。 我如何知道该设备是否具有此功能? 我不会用它太多来存储数据。 因此,我正在考虑购买32GB的microSD卡以加快速度,同时使用 ...

6 当共享内存从 RISC V 多核处理器中的 2 个内核收到 2 个写入请求时,它们会做什么?

我只是在做一个项目“设计一个基于 RISC-V ISA 的双核处理器,没有管道,没有私有或共享缓存,2 个内核共享一个数据存储器”。 我已经设计了 RISC V 单核处理器并且它工作正常。 有一点我不明白: 1)当数据存储器在同一地址收到 2 个写入请求时,它会做什么?(我阅读的书籍如下图 =& ...

7 CUDA阵列/表面存储器

调用函数test ,我打印dtr1数组。 我希望所有元素都能获得100分,但我没有得到它。 这是为什么? ...

2011-06-16 17:36:34 2 7193   cuda
8 CUDA全局存储器在哪里?

我知道在CUDA的内存层次结构中,我们拥有诸如共享内存,纹理内存,常量内存,寄存器之类的东西,当然还有我们使用cudaMalloc()分配的全局内存。 我一直在寻找可以找到的所有文档,但是我还没有遇到任何明确解释什么是全局内存的文档。 我相信分配的全局内存在图形卡本身的GDDR上,而 ...

9 CUDA表面存储器的峰值带宽?

表面存储器是CUDA中纹理高速缓存的只写模拟。 我在学术文献中发现了NVIDIA GPU 峰值带宽数 ,用于读取全局内存和共享内存。 但是,我发现有关CUDA内存设备写入吞吐量的信息较少。 特别是,我对Fermi和Kepler GPU上的CUDA表面存储器的带宽(以及延迟,如果已知 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM