Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vector CUDA:矢量相加和矢量大小_Vector_Cuda - Fatal编程技术网

Vector CUDA:矢量相加和矢量大小

Vector CUDA:矢量相加和矢量大小,vector,cuda,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; } } \uuu

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

__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;
    }
}
\uuuu全局\uuuuu无效添加(浮点*a、浮点*b、浮点*c、整数n)
{
int tid=blockIdx.x*blockDim.x+threadIdx.x;
而(tid
我首先启动内核一次,以便将其加载到设备上,然后,我测量内核执行的10次迭代

当我的向量长度为1000000比1000时,带宽要好得多

为什么?


谢谢。

GPU有很高的内存带宽(好)和很高的内存延迟(坏)。一个内存请求需要几百个周期才能满足,但也可能有许多正在进行的请求是流水线的

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


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

GPU有很高的内存带宽(好)和很高的内存延迟(坏)。一个内存请求需要几百个周期才能满足,但也可能有许多正在进行的请求是流水线的

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


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

GPU可以在有更多工作要做时隐藏内存延迟。GPU可以在有更多工作要做时隐藏内存延迟。但从我读取的数据来看,数据应该按128字节块(扭曲、合并…)读取。如果是这样,每个块应该有延迟,当我比较1000和1000000个元素时,差异应该是线性的,没有?
如果在这两种情况下读取一次数据,就会有差异。我不明白为什么1000个元素的延迟相对来说更重要。由于流水线,它不是线性的。假设每个块读取128字节,一个内存请求需要300个延迟周期。假设你有300个街区。在时钟滴答0时,第一块发出将由时钟滴答300满足的内存请求。在时钟节拍1时,另一个块执行(GPU上的上下文开关是空闲的),它将暂停到节拍301。最后一个块将在第299点发出内存请求,并在第599点得到满足。因此,所有300个区块将在总共600个循环中完成,而不是300*300=90000。实际延迟取决于您的特定卡。但从我读取的数据来看,数据应该以128字节的块(扭曲、合并…)读取。如果是这样,每个块应该有延迟,当我比较1000和1000000个元素时,差异应该是线性的,没有?
如果在这两种情况下读取一次数据,就会有差异。我不明白为什么1000个元素的延迟相对来说更重要。由于流水线,它不是线性的。假设每个块读取128字节,一个内存请求需要300个延迟周期。假设你有300个街区。在时钟滴答0时,第一块发出将由时钟滴答300满足的内存请求。在时钟节拍1时,另一个块执行(GPU上的上下文开关是空闲的),它将暂停到节拍301。最后一个块将在第299点发出内存请求,并在第599点得到满足。因此,所有300个区块将在总共600个循环中完成,而不是300*300=90000。实际延迟取决于您的特定卡。