【问题标题】:Whether Partial Identical Address Access Incurs Bank Conflicts in CUDA?部分相同的地址访问是否会在 CUDA 中引发银行冲突?
【发布时间】:2015-03-18 05:01:43
【问题描述】:

我阅读了一些关于 CUDA 编程的教程。他们中的大多数都提到“如果半扭曲的ALL线程访问相同的地址,则没有银行冲突(广播)”。我的问题是,部分相同的地址访问是否会在 CUDA 的共享内存中引起银行冲突?

假设每个 warp 有 32 个线程,那么 half-warp 将是 16 个线程。

(1)如果所有16个线程都访问Bank0上的同一个地址A,则广播后不会发生bank冲突。

(2) 但是如果 Thread-{0,1,...,6,7} 想访问 Bank0 上的地址 A 而 Thread-{8,9,...,14,15} 想访问怎么办? Bank1 上的地址 B?我想知道是否会有银行冲突。由于NOT所有half-warp线程都访问同一个地址(只有half-half-warp访问同一个地址),所以会出现bank冲突。

如果我的理解有误,请纠正我。非常感谢!

【问题讨论】:

    标签: cuda


    【解决方案1】:

    对于计算能力 1.x(CUDA 7 不再支持哪些设备),a single broadcast word 允许每个非存储区冲突的共享内存访问周期。

    对于计算能力 2.0 及更高版本,假设所有这些广播字都来自不同的银行,则在单个非存储区冲突的共享内存访问周期中允许任意数量的广播字。

    Documentation:

    与计算能力为 1.x 的设备不同,可以在单个事务中广播多个单词

    关于半扭曲的讨论仅与 cc1.x 设备有关。在您的情况 2 中,在 cc1.x 设备上,需要对所需的两种访问进行序列化,一种用于地址 A,另一种用于地址 B。这在行为上等同于 2-way bank 冲突。在您的情况 2 中,对于 cc2.0 及更高版本,不会出现银行冲突。

    【讨论】:

    • 非常感谢。这真的解决了我的问题!在 cc1.x 设备中,case 2 确实需要两个广播字,而只允许单个广播,所以访问另一个字会多一个内存周期,是吗?
    猜你喜欢
    • 2011-09-01
    • 2020-04-25
    • 1970-01-01
    • 2014-03-15
    • 2011-03-31
    • 2013-02-07
    • 1970-01-01
    • 2015-04-07
    • 2011-04-20
    相关资源
    最近更新 更多