CUDA:向量加法和向量大小

时间:2013-03-17 00:13:58

标签: vector cuda

我在执行内核时测量了两个向量之间的加法带宽:

__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时,带宽要好得多。

为什么?

感谢。

1 个答案:

答案 0 :(得分:5)

GPU具有非常高的内存带宽(良好)非常高的内存延迟(不良)。要满足内存请求需要几百个周期,但可以有许多流水线的正在进行的请求。

如果您只添加1000个元素,那么您真正测量的是内存延迟。

对于更大的向量,将有足够的线程块,当一个在内存上停滞时,GPU可以切换到其内存请求完成的另一个线程块。有了它们,你就是在测量带宽。