Cuda 与字数有关的银行冲突

Cuda 与字数有关的银行冲突,cuda,Cuda,我读了一些关于共享记忆的好文章;但我有一个关于银行冲突的初步问题 据说,如果线程1和线程2从组0访问单词0,则不存在组冲突 但如果他们使用不同的词语,那么就会出现银行冲突;但我的问题是,不同的词如何能存在于同一家银行? 因为组0大小为32位,字大小为32位;最多可以有1个字/库。如果GPU具有2.*或3.*的计算能力,则有32个共享内存库;但共享内存中的数据可能超过32个字(=128B)。每个银行b负责地址(比如)中的所有数据A%n银行==b: +--------+-------

我读了一些关于共享记忆的好文章;但我有一个关于银行冲突的初步问题 据说,如果线程1和线程2从组0访问单词0,则不存在组冲突 但如果他们使用不同的词语,那么就会出现银行冲突;但我的问题是,不同的词如何能存在于同一家银行?
因为组0大小为32位,字大小为32位;最多可以有1个字/库。

如果GPU具有2.*或3.*的计算能力,则有32个共享内存库;但共享内存中的数据可能超过32个字(=128B)。每个银行
b
负责地址(比如)中的所有数据
A%n银行==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 |...
        +--------+---------+---------+-

如果每个人都在访问word 0,则有“广播”功能;但是,如果线程0正在访问word 0,线程1正在访问word 32,等等,那么这些访问将被序列化。

我花了很多时间为那些在14.75上打印的行打印机制作ascii艺术“宽泛的绿条纸显然并没有完全浪费。我真的很感谢你们花时间和精力让我解释银行冲突。但事实上,我想问的是,既然银行的大小是32字节,字的大小是32字节,那么一个银行怎么能占用这么多字?银行是32位“宽”——每个银行负责处理一个字的共享内存请求。但它比一个项目“更深”。例如,费米每平方米有48KB的共享内存;这并不意味着有48KB/32b=12288个共享内存库;只有32个,每个都负责访问384个单独的32位字。所以说银行的“大小”是32位是不对的;字0的长度正好是32位。如果每个线程需要2个字的数据(假设每个线程在一个数组中加载连续的
double
s),那么第一个线程将从(假设)组0和组1加载,第二个线程将从组2和组3加载,等等。在这种情况下,会有一些组冲突和等待。是的。然而,在这种情况下,一些等待内存库的操作是不可避免的,因为线程正试图拉入8B*32=256字节的数据,而共享内存硬件在一次操作中只能提供4B*32=128字节。