Cuda 跨步内存访问的有效内存带宽

Cuda 跨步内存访问的有效内存带宽,cuda,gpu,stride,memory-bandwidth,Cuda,Gpu,Stride,Memory Bandwidth,假设我有一个内核,它执行如下的跨步内存访问: __global__ void strideExample (float *outputData, float *inputData, int stride=2) { int index = (blockIdx.x * blockDim.x + threadIdx.x) * stride; outputData[index] = inputData[index]; } 我知道跨步大小为2的访问将导致50%的加载/

假设我有一个内核,它执行如下的跨步内存访问:

__global__ void strideExample (float *outputData, float *inputData, int stride=2) 
{
        int index = (blockIdx.x * blockDim.x + threadIdx.x) * stride;
        outputData[index] = inputData[index]; 
}
我知道跨步大小为2的访问将导致50%的加载/存储效率,因为事务中涉及的元素有一半没有被使用(成为浪费的带宽)。我们如何计算更大步幅的负荷/存储效率?提前谢谢

一般来说:

load efficiency = requested loads / effective loads
其中,
请求的加载
是软件请求读取的字节数,
有效加载
是硬件实际必须读取的字节数。同样的公式也适用于商店

完全合并的访问的效率为1

您的代码准确地请求
(blockIdx.x*blockDim.x+threadIdx.x)*sizeof(float)
字节。假设
outputData
正确对齐(正如
cudamaloc
返回的指针一样),硬件必须读取
(blockIdx.x*blockDim.x+threadIdx.x)*sizeof(float)*stride
字节,四舍五入到事务大小(SM/L1为128字节,L1/L2为32字节)

假设您的块大小足够大,则事务大小的舍入可以忽略不计,您可以将等式简化为
1/步
,在这种情况下,负载效率约为16.7%。

通常:

load efficiency = requested loads / effective loads
其中,
请求的加载
是软件请求读取的字节数,
有效加载
是硬件实际必须读取的字节数。同样的公式也适用于商店

完全合并的访问的效率为1

您的代码准确地请求
(blockIdx.x*blockDim.x+threadIdx.x)*sizeof(float)
字节。假设
outputData
正确对齐(正如
cudamaloc
返回的指针一样),硬件必须读取
(blockIdx.x*blockDim.x+threadIdx.x)*sizeof(float)*stride
字节,四舍五入到事务大小(SM/L1为128字节,L1/L2为32字节)


假设您的块大小足够大,则事务大小的舍入可以忽略不计,您可以将等式简化为
1/步
,在这种情况下,负载效率约为16.7%。

好的,谢谢!假设我们在上述问题中的步幅为6,我们如何计算负载效率?CUDA计算能力1.1和1.2是否相同?好的,谢谢!假设我们在上述问题中的步幅为6,我们如何计算负载效率?CUDA计算能力1.1和1.2是否相同?