0

indirectJ2[MAX_SUPER_SIZE]是一个共享数组。

我的 cuda 设备内核包含以下语句(由线程块中的所有线程执行):

int nnz_col = indirectJ2[MAX_SUPER_SIZE - 1];

我怀疑这会导致银行冲突。

有什么方法可以 使用开普勒 GPU 的新随机播放指令有效地实现上述线程块级广播?我了解它在经线级别是如何工作的。也欢迎其他超出 shuffle 指令的解决方案(例如使用 CUB 等)。

4

1 回答 1

2

K40 上的那行代码没有银行冲突。共享内存访问已经提供了广播机制。引用编程指南

“对 warp 的共享内存请求不会在访问同一个 32 位字或两个 32 位字(其索引 i 和 j 在同一 64 字对齐)内的任何子字的两个线程之间产生存储库冲突段(即第一个索引是 64 的倍数的段)并且使得 j=i+32(即使两个子字的地址在同一个库中):在这种情况下,对于读访问, 32 位字被广播到请求线程

在线程块级别没有共享内存库冲突这样的概念。银行冲突仅与从单个 warp 发出的共享内存请求生成的访问模式有关,对于该 warp 中的单个指令。

如果您愿意,您可以编写一个简单的测试内核并使用分析器指标(例如shared_replay_overhead)来测试共享内存库冲突。

Warp shuffle 机制不会超出单个 warp;因此,不存在可以将单个数量广播到线程块中的多个 warp 的短的仅 shuffle 序列。共享内存用于为经线中的所有线程提供对单个数量的直接访问;你已经在这样做了。

全局内存、__constant__内存和内核参数也都可以用于向线程块中的所有线程“广播”相同的值。

于 2015-03-08T21:04:31.220 回答