首先,这里是算法的链接:
GPU Gems 3,第 39 章:使用 CUDA 的并行前缀和(扫描)。
为了避免存储库冲突,每个 NUM_BANKS(即,对于可计算性 2.x 的设备为 32 个)元素向共享内存阵列添加填充。这是通过(如图 39-5 所示)完成的:
int ai = offset*(2*thid+1)-1
int bi = offset*(2*thid+2)-1
ai += ai/NUM_BANKS
bi += ai/NUM_BANKS
temp[bi] += temp[ai]
我不明白 ai/NUM_BANKS 如何等同于宏:
#define NUM_BANKS 16
#define LOG_NUM_BANKS 4
#define CONFLICT_FREE_OFFSET(n) \
((n) >> NUM_BANKS + (n) >> (2 * LOG_NUM_BANKS))
不等于
n >> LOG_NUM_BANKS
任何帮助表示赞赏。谢谢