问题标签 [gpu-shared-memory]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 为什么我的内核没有超过共享内存限制?
我从 matlab 调用 CUDA 内核。
之前有人告诉我(David Kirk 的书),每个线程只能占用 16kb 的共享内存,但我能够消耗的远不止这些:
CUDA C 报告浮点数为 4 字节,这意味着总数组大小为 48Kb,大于 12Kb。它运行良好,那怎么可能呢?
我还被告知 GPU 共享内存的大小非常小 - 我该怎么办? 每个块的最大共享内存很重要。我的卡的每个块的最大共享内存为 49152 字节,但我能够以每块 1000 个线程运行上述代码。
似乎每个块会使用 49Kb,这是不对的。是不是 SM 一次只服务一个块并且在 dong 中保留了每个线程块只能有 49Kb 的条件?
每个块 49Kb 共享内存如何与每个线程 16Kb 共享内存相协调?
谢谢
memory-management - CUDA 有效使用共享/本地内存?
当谈到 CUDA 中的共享/本地内存时,我仍然有点不确定。目前我有一个内核,在内核中每个线程分配一个列表对象。像这样的东西
根据我目前的理解,每个线程都有自己的dlist
存储在本地内存中,这是真的吗?如果是这种情况,在内核执行结束时是否有任何方法来获取每个dlist
对象(来自另一个内核),或者我应该使用__shared__
由第一个线程分配的动态列表数组?
我想我可能有点过于复杂了,但我从来不需要更改列表,我试图实现的执行是这样的
- 创建列表(仅在 GPU 上完成)
- 从每个列表生成输出(在 GPU 上由每个线程完成,只需要为该线程分配的列表中的信息。)
- 修改/交换列表(仍然在 GPU 上完成)
- 重复 2 和 3,直到在主机上满足某些中断条件
提前致谢!
cuda - 通过共享内存传递内核参数是否值得?
假设我们有一个数组int * data
,每个线程都会访问这个数组的一个元素。由于该数组将在所有线程之间共享,因此它将保存在全局内存中。
让我们创建一个测试内核:
我确定该data
数组将位于全局内存中,因为我使用cudaMalloc
. 现在至于其他变量,我已经看到了一些示例,它们在不分配内存的情况下立即将整数传递给内核函数。在我的情况下,这些变量是a
b
和c
。
如果我没记错的话,即使我们没有直接调用cudaMalloc
为每三个整数分配 4 个字节,CUDA 也会自动为我们做这件事,所以最终变量a
b
和c
将被分配到全局内存中。
现在这些变量只是辅助的,线程只读取它们而没有别的。
我的问题是,将这些变量转移到共享内存不是更好吗?
我想如果我们有例如10
带有1024
线程的块,我们将需要10*3 = 30
读取4
字节以便将数字存储在每个块的共享内存中。
如果没有共享内存,并且如果每个线程都必须读取所有这三个变量一次,那么全局内存读取的总量将1024*10*3 = 30720
非常低效。
现在这是问题所在,我对 CUDA 有点陌生,我不确定是否可以将变量的内存传输a
b
到c
每个块的共享内存,而无需每个线程从全局内存中读取这些变量并加载它们到共享内存,所以最终全局内存读取的总量将是1024*10*3 = 30720
而不是10*3 = 30
。
在以下网站上有这个例子:
这里每个线程在共享变量中加载不同的数据s
。所以每个线程,根据它的索引,在共享内存中加载指定的数据。
就我而言,我只想加载变量a
b
和c
共享内存。这些变量始终是相同的,它们不会改变,因此它们与线程本身没有任何关系,它们是辅助的,并且被每个线程用于运行某些算法。
我应该如何解决这个问题?total_amount_of_blocks*3
是否可以通过仅进行全局内存读取来实现这一点?
cuda - 从全局内存加载二维数据时,CUDA Fortran 中的共享内存库冲突
我正在访问全局内存以将数据加载到共享内存,并想知道是否存在银行冲突。这是设置:
在全局内存中:g_array
. 大小为 (256, 64) 的二维矩阵
这就是我将数组数据从全局内存加载到共享内存的方式。我用 gridDim (4, 1) 和 blockDim (16, 16) 调用内核。
c++ - 收到 CUDA 错误“声明与以前的“变量名称”不兼容
我正在尝试使用 MSVS 2012 和 CUDA 编译一个包含内核的程序。我使用共享内存,但与关于同一问题的这个问题不同,我只将我的变量名用于此内核的共享内存一次,因此不存在重新定义的问题。使用这样的代码:
它被实例化为几种类型(例如float,int,unsigned int),我得到了可怕的
信息。什么可能导致这种情况?
cuda - Fermi 和更高版本中共享内存库冲突的相关性
根据我在 CUDA 文档中读到的内容,共享内存库冲突与 sm_20 及更高版本无关,因为在同时请求值时会广播值,从而防止任何类型的序列化延迟。
文档:
共享内存硬件在计算能力 2.x 的设备上得到了改进,以支持多个广播字,并为每个线程的 8 位、16 位、64 位或 128 位访问产生更少的存储库冲突(第 G.2 节)。 4.3)。
有人可以证实我的说法吗?
cuda - 使用 Nvidia 平台为 OpenCL 配置本地(共享)内存
我想在我的 OpenCL 内核中优化我的本地内存访问模式。我在某处阅读了有关可配置本地内存的信息。例如,我们应该能够配置用于本地内存的数量以及用于自动缓存的数量。
我还读到这里可以为最新的(Kepler)Nvidia 硬件选择存储库大小: http ://www.acceleware.com/blog/maximizing-shared-memory-bandwidth-nvidia-kepler-gpus 。这一点对于在本地内存中存储双精度值似乎非常关键。
Nvidia 是否提供专门为 CUDA 用户设置本地内存的功能?我找不到类似的 OpenCL 方法。那么这可能以不同的方式调用还是真的不存在?
cuda - cudaFuncSetCacheConfig - 适用于所有设备或当前设备?
如果我调用该cudaFuncSetCacheConfig
函数(它选择我更喜欢更多 L1、更多共享内存还是等量 - 在 Kepler 和 Maxwell 设备上) - 它是否适用于在我系统上的所有设备上启动该内核,还是仅适用于当前设备?(API 参考并没有真正说)
cuda - 如何启动具有“尽可能多的动态共享内存”的内核?
我们知道 CUDA 设备的共享内存容量非常有限,只有几十千字节。而且我们也知道如果您要求太多共享内存,内核将不会启动(通常?曾经?)。而且我们还知道,您使用的代码中的静态分配和动态分配的共享内存都使用了可用的共享内存。
现在,cudaGetDeviceProperties()
给了我们我们所拥有的整体空间。但是,给定一个函数符号,是否可以确定它将使用多少静态分配的共享内存,以便我可以在启动时将共享内存“填满”到最大容量?如果没有,是否有可能让 CUDA 以某种方式为我处理这个问题?