首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表观数据自动化系统魔法

表观数据自动化系统魔法
EN

Stack Overflow用户
提问于 2015-07-31 05:15:05
回答 1查看 188关注 0票数 0

我正在使用CUDA (实际上我使用的是pyCUDA,如果有差异的话),并对数组执行一些计算。我正在启动一个由320*600个线程组成的网格内核。在内核中,我使用以下方法声明了两个由20000个组件组成的线性数组:

代码语言:javascript
复制
float test[20000]
float test2[20000]

对于这些数组,我执行简单的计算,例如用常量填充它们。关键是内核通常执行正确地执行计算(您可以看到这个填充数组的随机测试组件,并将该数组从设备发送到主机)。

问题是我的NVIDIA卡只有2GB的内存,用于分配数组测试的内存总量和test2是320*600*20000*4字节,远远超过2GB。

,这个记忆是从哪里来的?而数据自动化系统如何在每个线程中执行计算呢?

谢谢您抽时间见我

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-31 06:20:09

本地/堆栈内存需求的实际大小并不像您想象的那样(对于整个网格来说都是一次调整),实际上是基于@njuffa 这里描述的公式。

基本上,本地/堆栈内存需求的大小是根据正在运行的设备的最大瞬时容量,而不是网格的大小。

根据njuffa提供的信息,可用的堆栈大小限制(每个线程)较小:

  1. 最大本地内存大小( cc2.x和更高版本为512 and )
  2. 可用GPU内存/(SMs的#)/(每个SM的最大线程)

对于你的第一个案子:

代码语言:javascript
复制
float test[20000];
float test2[20000];

这个总数是160 we (每个线程),因此我们处于每个线程512 we的最大限制之下。第二个限制呢?

GTX 650米有2 cc3.0(开普勒)短消息(每个开普勒SM有192个核心)。因此,上面的第二个限制给出了,如果所有GPU内存都可用

2GB/2/2048 =512 2GB

(开普勒有每个多处理器2048个最大线程)所以在这种情况下它是相同的极限。但这假设所有GPU内存都可用。

因为您在注释中建议此配置失败:

代码语言:javascript
复制
float test[40000];
float test2[40000];

例如,320 be,我将得出结论,您的实际可用GPU内存在此大容量分配尝试中的某个位置高于(160/512)*100%,即高于31%,但低于(320/512)*100%,即低于2GB的62.5%,因此我的结论是,在对堆栈帧进行大容量分配请求时,您的可用GPU内存将小于1.25GB。

您可以试着在内核启动之前调用cudaGetMemInfo (虽然我不知道如何在pycuda中这样做),看看是否是这样。即使您的GPU从2GB开始,如果您从它开始运行该显示器,那么您很可能从一个接近1.5GB的数字开始。在内核启动时,在此批量分配请求之前发生的动态分配(例如cudaMalloc)和静态分配(例如__device__)都会影响可用内存。

这些都是为了解释其中的一些细节。对您的问题的一般回答是,由于GPU不一定同时为网格中的所有线程分配堆栈帧和本地内存,所以出现了“魔力”。它只需要分配设备的最大瞬时容量所需的内容(即SMs * max线程(每SM) ),这个数字可能比整个网格所需的要小得多。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31738540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档