假设我有一个执行跨步内存访问的内核,如下所示:
@Override
public String toString() {
return firstName.get();
}
据我所知,步幅大小为2的访问将导致50%的加载/存储效率,因为事务中涉及的一半元素未被使用(成为浪费的带宽)。我们如何着手计算更大步幅的载荷/存储效率?提前谢谢!
答案 0 :(得分:4)
一般来说:
load efficiency = requested loads / effective loads
其中requested loads
是软件请求读取的字节数,effective loads
是硬件实际必须读取的字节数。相同的公式适用于商店。
完美合并的访问的效率为1。
您的代码正好要求(blockIdx.x * blockDim.x + threadIdx.x) * sizeof(float)
个字节。假设outputData
正确对齐(与cudaMalloc
返回的指针一样),硬件必须读取(blockIdx.x * blockDim.x + threadIdx.x) * sizeof(float) * stride
个字节,四舍五入到事务大小(SM / L1为128字节,32 L1 / L2的字节数。)
假设您的块大小足够大,则事务大小的舍入变得可以忽略不计,您可以将公式简化为1 / stride
,在这种情况下,加载效率约为16.7%。