与字长相关的银行冲突

3

我读了一些关于共享内存的好文章,但是我有一个关于bank conflicts的初步问题。据说如果线程1和线程2从bank 0访问单词0,则不会发生bank conflict,但如果它们访问不同的单词,则会出现bank conflict; 但我的问题是如何在一个单一的bank中容纳不同的单词?由于bank 0的大小为32位,而单词大小也为32位,因此最多只能有1个单词/ bank。

1个回答

9

如果您拥有一个计算能力为2.*或3.*的GPU,则有32个共享内存银行;但您可能会在共享内存中拥有超过32个字(= 128B)的数据。每个银行b负责地址(例如)A%nbanks == b中的所有数据:

        +--------+---------+---------+-
Bank 0  | word 0 | word 32 | word 64 |...
        +--------+---------+---------+-
Bank 1  | word 1 | word 33 | word 65 |...
        +--------+---------+---------+-
Bank 2  | word 2 | word 34 | word 66 |...
        +--------+---------+---------+-
 ...    |  ..... |         |         |
        +--------+---------+---------+-
Bank 30 | word 30| word 62 | word 94 |...
        +--------+---------+---------+-
Bank 31 | word 31| word 63 | word 95 |...
        +--------+---------+---------+-

如果每个人都在访问第0个单词,那么有“广播”功能来处理;但是如果线程0正在访问第0个单词,线程1正在访问第32个单词等等,则这些访问将被串行化。

3
我花费时间为那些可以打印在14.75英寸宽绿条纸上的行式打印机制作ASCII艺术品,显然并不完全是浪费。 - Jonathan Dursi
2
该银行是32位“宽”的 - 每个银行负责处理一个字的共享内存请求。但它比一个项目“深”。例如,Fermi每个SM有48KB的共享内存;这并不意味着有48KB/32b = 12,288个共享内存银行;只有32个,每个银行负责访问384个单独的32位字。因此,说银行的“大小”为32位并不完全正确。 - Jonathan Dursi
非常感谢您的回复。它帮助我理解了共享内存库的概念。现在我将尝试通过实例来加深理解,看看自己是否能够掌握。 - robot
1
第0个字并不比32位更大;第0个字恰好是32位长。如果每个线程需要2个字的数据 - 比如说它们正在加载数组中连续的“double” - 那么第一个线程将从(假设)bank 0和bank 1加载,第二个线程将从bank 2和bank 3加载,以此类推。在这种情况下会出现一些银行冲突和等待。 - Jonathan Dursi
1
是的。然而,在这种情况下,一些等待内存银行是不可避免的,因为线程试图拉取8B32=256字节的数据,共享内存硬件在单个操作中只能提供4B32=128字节。 - Jonathan Dursi
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接