CUDA: 使用shared memory

CUDA中的thread按块组织,每个block拥有共享内存供内部所有线程共享,因位于芯片上,访问速度快。但使用时可能产生bank conflicts,特别是在2.x系列GPU上,每个block的shared memory有32个banks。此外,为了避免race conditions,需要使用__syncthread()进行同步操作。
摘要由CSDN通过智能技术生成

CUDA 的thread本身是有层次结构的。 thread 被grouped成多个thread blocks。 同一个block 的threads 在同一时间, 运行在同一个SM上。

每一个block都有一个shared memory, 是被这个block内的所有的thread所共享的。 一个SM一次最多只能运行8个blocks。

我们知道, global memory, texture memory, constant memory 并没有在chip上面, 所以存取速度慢。 而shared memory 是on chip 上的, 故而速度很快。

并且我们的shared memory 是block级别的, 所以我们要充分利用shared memory存取速度快的特点, 可以将数据对象一次就load到shared memory 上面, 然后直接在shared memory 上进行数据的存取相关的操作。


但是使用shared memory 容易造成bank conflicts。 所谓的bank 就是shared memory arrays 被细分成多个小的subarrays, 这些小的subarray就被称为bank。

在计算能力为2.X(1.X)的GPU上, 每个block的shared memory 有32(16)个banks。 连续的32位的words被设置为连续的banks上。 不同的banks 能够同时被访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值