问题标签 [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.

0 投票
2 回答
180 浏览

android - 移动 OpenCL 本地内存库冲突。为什么在内核中使用本地内存比使用全局内存慢?

我正在使用OpenCL. 人脸检测算法基于 Viola Jones 算法。我试图制作 Cascade 分类步骤内核代码。我在级联阶段中设置classifier data了级联阶段 1,local memory(__local)因为分类器数据用于所有工作项。

但是,不使用本地内存(使用全局内存)的内核分析时间比使用本地内存更快。

编辑:

我上传了完整的代码。


带本地内存版本


原始版本(没有本地内存)


分析时间:原始版本(不带本地内存):24ms 修改版本(带本地内存):28ms

编辑:实际上 localWorkSize NULL 因为 globalWorkSize 总是因放置 NDRangeKernel 的向量大小而异。当放置特定的localWorkSize时,人脸检测率下降......所以我尝试将localWorkSize NUll,然后人脸检测率很好。所以我想知道原因。

这是主机代码:

0 投票
2 回答
254 浏览

opencl - 随机内存访问和银行冲突

这些天来,我正在尝试移动 gpu(adreno)上的程序

我用于图像处理的算法对内存访问具有“随机性”。

它引用“固定”范围内的一些像素进行过滤。

但是,我无法确切知道将引用哪个像素(取决于图像)

据我了解。如果多个线程访问本地内存银行,则会导致银行冲突。所以在我的情况下,它应该引起银行冲突。

我的问题:我可以消除随机内存访问时的银行冲突吗?

或者我可以减少它们吗?

0 投票
1 回答
340 浏览

cuda - 故意导致 CUDA 设备上共享内存的银行冲突

对我来说,cuda 设备上的共享内存如何工作是个谜。我很想计算可以访问相同共享内存的线程。为此我写了一个简单的程序

并在 K80 GPU 上运行它。由于多个线程可以访问同一个共享内存变量,我期待这个变量将被更新 5*nhr 次,尽管由于银行冲突而不是在同一个周期。但是,输出表明mywarp共享变量仅更新了 5 次。对于每个块,不同的线程完成了这个任务:

相反,我期待

对于每个块。有人可以解释一下我对共享内存的理解在哪里失败。我还想知道一个块中的所有线程如何访问(更新)相同的共享变量。我知道在同一个 MP 周期是不可能的。序列化对我来说很好,因为这将是一个罕见的事件。

0 投票
1 回答
925 浏览

cuda - 如何使用 NVIDIA Visual Profiler 测量每个扭曲的银行冲突?

我正在做一个详细的代码分析,我想测量每个 warp 的银行冲突总数。

nvvp文档列出了这个指标,这是我能找到的唯一一个与银行冲突相关的指标:

shared_replay_overhead:每条执行指令因共享内存冲突而重播的平均次数

当我使用nvprof(或nvvp)分析指标时,我得到如下结果:

我需要利用这个值0.089730或设计一些其他方法来衡量银行冲突的数量。

我知道这个值是所有正在执行的经纱的“平均值”。如果我必须测量每个 warp 的银行冲突总数,有没有办法使用nvprof结果来做到这一点?

我想到的可能的方法:

  • 通过使用shared_replay_overhead结果并在公式中使用它们来计算银行冲突的数量。我猜我必须应用某种公式,比如shared_replay_overhead * Total number of warps launched我事先知道的地方Total number of warps launched,但我不知道是什么。
  • 通过首先检测它是四路存储库冲突、八路存储库冲突等,然后将4/乘以8共享内存操作发生的次数(如何测量?)。

除了nvprof结果之外,这可能还需要相当好的关于 GPU 架构的技术知识,我认为我还没有。作为记录,我的 GPU 是 Kepler 架构,SM 3.5。

即使我可以测量每个块而不是每个扭曲的银行冲突数量,也足够了。之后,我可以进行必要的计算以获取每个经线的值。

0 投票
1 回答
136 浏览

cuda - 同一个线程两次访问同一个内存库会导致冲突吗?

我正在研究一个可以减少向量的内核。它基本上将向量中的所有位置相加并将结果存储在位置 0 中。

我正在遵循这个方案,包含 512 个浮点元素块:

减少计划

编码:

奇怪的是,我预计会出现共享的银行冲突,但我没有。在第一次迭代中,线程 0 将位置 0 和位置 256 相加,它们位于同一组中。线程 1 将位置 1 和位置 257 相加,依此类推。

所有这些操作都需要扭曲中的每个线程从同一银行获得 2 个不同的值,但是,我没有任何冲突:

结果

我错过了什么?

0 投票
1 回答
1787 浏览

cuda - GPU共享内存实例

我有一个这样的数组:

我想使用 G80 GPU 上的共享内存来计算这个数组的减少。

NVIDIA 文档中引用的内核是这样的:

该论文的作者表示,这种方法存在银行冲突的问题。我试图理解,但我不知道为什么?我知道银行冲突和广播访问的定义,但仍然无法理解。

银行冲突

0 投票
1 回答
198 浏览

c++ - CUDA:重载共享内存以实现多个数组的归约方法

我有 5 个大型数组 A(N*5)、B(N*5)、C(N*5)、D(N*5)、E(N*2) 数字 5 和 2 代表这些变量的组成部分在不同的平面/轴上。这就是我以这种方式构建数组的原因,因此我可以在编写代码时可视化数据。N ~ 200^3 ~ 8e06 个节点

例如:这是我的内核最简单的样子,我在全局内存上进行所有计算。

我知道可以消除“for”循环,但我把它留在这里,因为它方便查看代码。这可行,但显然即使在删除“for”循环之后,Tesla K40 卡的效率极低且速度很慢。“for”循环中显示的算术只是为了给出一个想法,实际的计算要长得多,并且与 res1、res2... 也混在一起。

我已经实现了以下改进,但我想通过共享内存的超载来进一步改进它。

这有点帮助,但我想实施其中一种减少方法(没有银行冲突)以提高性能,我可以将所有变量放入共享中(可能是平铺方法),然后进行计算部分。我在 CUDA_Sample 文件夹中看到了归约示例,但该示例仅适用于对共享中的一个向量求和,而无需对共享内存中的多个数组进行任何复杂的算术运算。对于改进我现有的 kernel_shared 方法以包括减少方法的任何帮助或建议,我将不胜感激。

0 投票
2 回答
669 浏览

cuda - 64位线程分离共享内存最小化bank冲突的策略

假设我在一个 CUDA 块中有一个完整的线程扭曲,并且这些线程中的每一个都旨在与驻留在共享内存中的 T 类型的 N 个元素一起工作(所以我们总共有 warp_size * N = 32 N 个元素)。不同的线程从不访问彼此的数据。(嗯,他们这样做,但在稍后阶段,我们在这里不关心)。此访问将在循环中发生,如下所示:

现在,不同的线程可能每个都有不同的索引,或者相同 - 我不会以这种或那种方式做出任何假设。但我确实想尽量减少共享内存库冲突。

如果sizeof(T) == 4,那么这很容易:只需将线程 i 的所有数据放在共享内存地址 i、32+i、64+i、96+i 等中。这会将 i 的所有数据放在同一个 bank 中,这也是不同的从另一条车道的银行。伟大的。

但是现在——如果sizeof(T) == 8呢?我应该如何放置和访问我的数据,以尽量减少银行冲突(对指数一无所知)?

注意:假设 T 是普通旧数据。如果这使您的答案更简单,您甚至可以假设它是一个数字。

0 投票
1 回答
638 浏览

cuda - CUDA 共享内存效率为 50%?

我有以下代码使用共享内存执行平铺矩阵转置以提高性能。共享内存用 1 列填充,以避免 32x32 线程块的银行冲突。

运行这段代码,我在 NVIDIA 视觉分析器中获得了 100% 的共享内存效率,正如我所期望的那样。但是,当我使用 16x16 线程块运行它时,我只能获得 50% 的效率。这是为什么?据我所知,经线中的线程没有从具有这种布局的同一银行读取。还是我弄错了?

0 投票
1 回答
568 浏览

cuda - CUDA 上共享内存中的非顺序访问引起的银行冲突

我正在编写一些针对 Volta 和 Turing 系列卡的 CUDA 中具有短程交互的 N 体模拟代码。我计划使用共享内存,但我不太清楚这样做时如何避免银行冲突。由于我的交互是本地的,我计划将我的粒子数据分类到本地组中,我可以将它们发送到每个 SM 的共享内存(还不担心有邻居正在从另一个 SM 处理的粒子。为了变得更好性能(避免银行冲突),仅每个线程从/向共享内存的不同地址读取/写入就足够了,但每个线程可以非顺序访问该内存而不会受到惩罚?

我看到的所有信息似乎都只提到内存被合并以从全局内存复制到共享内存,但我没有看到任何关于扭曲(或整个 SM)中的线程是否关心共享内存中的合并。