二维内核中的银行冲突

Posted

技术标签:

【中文标题】二维内核中的银行冲突【英文标题】:Bank conflict in 2D kernel 【发布时间】:2014-12-18 06:31:08 【问题描述】:

假设我们的硬件有 32 个 4 字节宽的存储体。我们有一个大小为 32 的一维内核和一个本地一维整数数组。

然后,确保每个连续线程访问数组中连续的内存位置应该避免银行冲突。

但是,假设我们有一个 8 x 4 2D 内核和相同的 1D 数组。如何确保没有银行冲突?我们如何定义二维数组的“连续线程”?

【问题讨论】:

简单地将线程 ID 从 2D 线性化到 1D。 谢谢,蝉。你的意思是 get_local_id(0) + get_local_id(1) * 4 吗? This post 及其答案有助于了解如何定义 2D 工作组中的连续线程。 @Farzad 谢谢这很有用 【参考方案1】:

您可以获得与在 1D 情况下使用 get_global_id(0) 在 2D 情况下使用此代码获得的相同的全局工作项 ID:

get_global_id(1) * get_global_size(0) + get_global_id(0);

如果您想在工作组中获取本地工作项 ID,只需将全局变量更改为本地变量即可。

【讨论】:

谢谢,bl0z0。这在任何地方都有记录吗? 我自己弄明白了,因为我处理过很多存储为一维数组的图像。但是您也可以从 Fazard 给您的链接中找到它。 IIRC 它位于§3.2 Execution Model 酷。谢谢,蝉。

以上是关于二维内核中的银行冲突的主要内容,如果未能解决你的问题,请参考以下文章

从同一位置读取时 CUDA 中的银行冲突

使用内核参数会导致银行冲突吗? [关闭]

如何减少此代码中的银行冲突?

NSight Compute - 预期银行冲突但未检测到任何

从共享内存中读取 int 数组是不是会排除银行冲突?

我可以假设计算能力 3.0 中没有银行冲突吗?