【问题标题】:Bank conflicts for strided access跨步访问的银行冲突
【发布时间】:2012-11-28 20:09:48
【问题描述】:

我正在阅读 CUDA_C_Programming_Guide,在共享内存主题中,我遇到了一个示例: 设备计算能力:1.0,共享内存中的 16 个存储库

extern __shared__ float shared[]; 
float data = shared[BaseIndex + s * tid];

在他们得出的解释中,'s' 必须是奇数,谁能帮我理解s 为偶数时会发生什么以及s 为奇数时会发生什么?

【问题讨论】:

  • This answer 可能会帮助您入门
  • @talonmies:感谢您的回复。我看到了你在共享内存中为 pre-fermi 架构发布的 A[16][16] 的解决方案。但我无法理解银行是如何安排的;即 Row0 与 bank0,row1 与 bank1,等等?或者你能用这里发布的图片来解释:stackoverflow.com/questions/13534695/…

标签: cuda


【解决方案1】:

奇数s的结论不容易直接看出来,但是如果你在bank冲突发生时尝试推导(两个线程tid和tid'访问同一个bank),假设bank数为32:

s*tid == s*tid' (mod 32)

s*tid == s*(tid + n) (mod 32) 其中 tid' = tid + n

s*tid == s*tid + s*n (mod 32)

s*n == 0 (mod 32)

n = (32/d)*k for some k and d = gcd(s, 32)

所以当32小于等于32/d时不会发生bank冲突

由于 d = gcd(s, 2^5),s 必须是奇数。

关于您在 cmets 中的问题,我没有完全理解您不理解的内容,但简单的解释是:如果两个线程尝试访问同一个银行(这意味着访问同一行中的两个单词),则访问是序列化的。

【讨论】:

  • :感谢您的回复。我试图理解。但是,如果你能告诉我,为什么每次都写(mod 32)?我也不知道“n”是如何以及从哪里来的,以及“n”的方程是如何得出的。这是否意味着线程 0,tid=0 和线程 32,tid=0 和 n=32。是你的意思吗。我也知道为什么 32 应该小于或等于 32,如果它更大会发生什么?
  • (mod 32) 每次都写,因为它是模方程(模运算后方程的每一边必须相等)。 'n' 用作两个 id 之间的差异,方程是通用的,所以它可以有很多值,你的例子也是正确的。最后一件事,如果 32 大于 32/d,则等式适用于更多的 'n' 值。
  • :感谢您的回复。如果我们考虑线程 id 3 和线程 id 35,那么 'n' = 32,因此现在 if's' =1,那么对于线程 id = 3,tid mod32 = 3 并且对于线程 id = 35,tid mod 32 也 = 3。考虑在这种情况下,当 's' = 2 时,对于线程 id 3,tid mod32 = 6,对于线程 id 70,tid mod 32 = 6。因此,当 's' 为奇数或偶数时,同样适用。那么为什么's'需要是奇数呢?如果 32 大于 32/d,则等式适用于更多的 'n' 值,但其中有什么问题?
  • 我认为你的方法是正确的,唯一需要意识到的是线程块被分割成warp。
  • :感谢您的回复。我试图理解它;但如果你能让我知道原始问题中的基本索引是什么;怎么提供,语法是什么?
猜你喜欢
  • 2015-07-20
  • 2023-03-18
  • 2011-09-01
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 2014-12-18
相关资源
最近更新 更多