我在执行内核时测量了两个向量之间的加法带宽:
__global__ void add(float *a, float *b, float *c, int n)
{
int tid = blockIdx.x*blockDim.x + threadIdx.x;
while (tid < n)
{
c[tid] = a[tid] + b [tid];
tid += blockDim.x * gridDim.x;
}
}
我首先启动内核一次,然后将其加载到设备上,接下来,我测量内核执行的10次迭代。
当矢量的长度为1000000而不是1000时,带宽要好得多。
为什么?
感谢。
答案 0 :(得分:5)
GPU具有非常高的内存带宽(良好)和非常高的内存延迟(不良)。要满足内存请求需要几百个周期,但可以有许多流水线的正在进行的请求。
如果您只添加1000个元素,那么您真正测量的是内存延迟。
对于更大的向量,将有足够的线程块,当一个在内存上停滞时,GPU可以切换到其内存请求完成的另一个线程块。有了它们,你就是在测量带宽。