问题标签 [bank-conflict]
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.
cuda - CUDA中的warp和bank的机制是什么?
我是学习CUDA并行编程的菜鸟。现在我对设备的全局内存访问感到困惑。这是关于翘曲模型和合并的。
有几点:
据说一个块中的线程被分成经线。在每个经纱中最多有 32 个线程。这意味着同一个warp的所有这些线程将在同一个处理器上同时执行。那么半曲折的意义是什么?
当涉及到一个块的共享内存时,它会被分成16个bank。为了避免银行冲突,多个线程可以同时读取一个银行,而不是写入同一个银行。这是一个正确的解释吗?
提前致谢!
cuda - L1缓存的CUDA银行冲突?
在 NVIDIA 的 2.x 架构上,每个 warp 有 64kb 的内存,默认情况下划分为 48kb 的共享内存和 16kb 的 L1 缓存(服务global
和constant
内存)。
我们都知道访问共享内存的银行冲突——内存被分成 32 个大小为 32 位的银行,以允许所有 32 个线程同时独立访问。另一方面,全局内存虽然慢得多,但不会遇到存储库冲突,因为内存请求是通过 warp 合并的。
问题: 假设来自全局或常量内存的一些数据缓存在 L1 缓存中,用于给定的 warp。对这些数据的访问是否会受到存储冲突的影响,例如共享内存(因为 L1 缓存和共享内存实际上是相同的硬件),还是像全局/常量内存那样没有存储冲突?
c++ - CUDA - determine number of banks in shared memory
Shared memory is "striped" into banks. This leads to the whole issue of bank conflicts, as we all know.
Question: But how can you determine how many banks ("stripes") exist in shared memory?
(Poking around NVIDIA "devtalk" forums, it seems that per-block shared memory is "striped" into 16 banks. But how do we know this? The threads suggesting this are a few years old. Have things changed? Is it fixed on all NVIDIA CUDA-capable cards? Is there a way to determine this from the runtime API (I don't see it there, e.g. under cudaDeviceProp)? Is there a manual way to determine it at runtime?)
cuda - 从全局内存加载二维数据时,CUDA Fortran 中的共享内存库冲突
我正在访问全局内存以将数据加载到共享内存,并想知道是否存在银行冲突。这是设置:
在全局内存中:g_array
. 大小为 (256, 64) 的二维矩阵
这就是我将数组数据从全局内存加载到共享内存的方式。我用 gridDim (4, 1) 和 blockDim (16, 16) 调用内核。
cuda - CUDA:不同经线之间的银行冲突?
我刚刚了解到(从Why only a warp is executed by a SM in cuda?)中,Kepler GPU 实际上可以一次执行来自多个(显然是 4 个)warp 的指令。
共享内存库也可以同时服务四个请求吗?如果不是,那意味着银行冲突可能发生在碰巧同时执行的不同warp的线程之间,即使在任何单独的warp中都没有银行冲突,对吧?有这方面的信息吗?
c - 银行冲突是否发生在非 GPU 硬件上?
这篇博文解释了内存库冲突如何影响转置函数的性能。
现在我不禁想知道:“普通”cpu(在多线程上下文中)是否也会发生同样的情况?或者这是特定于 CUDA/OpenCL 的?或者它甚至没有出现在现代 CPU 中,因为它们的缓存大小相对较大?
cuda - Fermi 和更高版本中共享内存库冲突的相关性
根据我在 CUDA 文档中读到的内容,共享内存库冲突与 sm_20 及更高版本无关,因为在同时请求值时会广播值,从而防止任何类型的序列化延迟。
文档:
共享内存硬件在计算能力 2.x 的设备上得到了改进,以支持多个广播字,并为每个线程的 8 位、16 位、64 位或 128 位访问产生更少的存储库冲突(第 G.2 节)。 4.3)。
有人可以证实我的说法吗?
opencl - Bank conflict in 2D kernel
Suppose our hardware has 32 banks of 4 byte width. And we have a 1D kernel of size 32, and a local 1D array of ints.
Then, ensuring that each consecutive thread accesses consecutive memory locations in the array should avoid bank conflicts.
But, suppose we have an 8 x 4 2D kernel and the same 1D array. How can I ensure that there are no bank conflicts? How do we define "consecutive thread" for a 2D array?
cuda - 银行冲突CUDA共享内存?
我在 CUDA 内核中遇到(我相信是)共享内存库冲突。代码本身相当复杂,但我在下面附加的简单示例中复制了它。
在这种情况下,它被简化为从全局 -> 共享 -> 全局内存的简单副本,大小为 16x16 的 2D 数组,使用可能在右侧填充的共享内存数组(变量ng
)。
如果我使用 NVVP 编译代码ng=0
并检查共享内存访问模式,它会告诉我“没有问题”。例如,我在标有"NVVP warning"ng=2
的行中得到"Shared Store Transactions/Access = 2, Ideal Transactions/Acces = 1 " 。我不明白为什么(或更具体地说:为什么填充会导致警告)。
编辑 如下格雷格史密斯所述,在开普勒上有 32 个 8 字节宽的银行(http://gpgpu.org/wp/wp-content/uploads/2013/09/08-opti-smem-instr.pdf,幻灯片18). 但我看不出这会如何改变问题。
如果我理解正确,有 32 个(B1, B2, ..)
4 字节的银行,双打(D01, D02, ..)
存储为:
没有填充,半扭曲写入 ( as[ijs] = in[ij]
) 到 shared-memoryD01 .. D15
等D16 .. D31
。使用填充(大小为 2),前半扭曲写入D01 .. D15
,填充后的第二个写入D18 .. D33
,这仍然不应该导致银行冲突吗?
知道这里可能出了什么问题吗?
简化示例(使用 cuda 6.5.14 测试):
cuda - CUDA 共享内存库冲突报告更高
我一直在优化一些代码,并在 CUDA Nsight 性能分析中遇到了共享内存库冲突报告的问题。我能够将它简化为 Nsight 报告为存在银行冲突的非常简单的一段代码,而它似乎不应该存在。下面是内核:
以及调用它的主要功能:
请注意,我正在使用单个扭曲来真正将其减少到最低限度。当我运行代码时,Nsight 说有 1 个银行冲突,但根据我读过的所有内容,不应该有任何冲突。对于对共享内存数组的每次访问,每个线程都在访问连续的值,每个值都属于不同的存储体。
是否有其他人在报告 Nsight 时遇到过问题,或者我只是在银行冲突的运作方面遗漏了一些东西?我将不胜感激任何反馈!
顺便说一句,我正在运行以下设置:
- 视窗 8
- GTX 770
- Visual Studio 社区 2013
- CUDA 7
- Nsight Visual Studio 4.5版