【发布时间】:2016-10-09 19:14:02
【问题描述】:
作为在 GPU 上运行的算法分析的一部分,我觉得我正在达到内存带宽。
我有几个复杂的内核执行一些复杂的操作(稀疏矩阵乘法、归约等)和一些非常简单的操作,当我计算读取/写入的总数据时,似乎所有(重要的)都达到了 ~79GB/s 带宽壁垒对于它们中的每一个,无论它们的复杂程度如何,而理论 GPU 带宽为 112GB/s (nVidia GTX 960)
数据集非常大,对约 10,000,000 个浮点条目的向量进行操作,因此我从 clGetEventProfilingInfo 在 COMMAND_START 和 COMMAND_END 之间获得了良好的测量/统计数据。在算法运行期间,所有数据都保留在 GPU 内存中,因此几乎没有主机/设备内存传输(也不通过分析计数器测量)
即使对于解决x=x+alpha*b 的非常简单的内核(见下文),其中 x 和 b 是约 10,000,000 个条目的巨大向量,我也没有接近理论带宽 (112GB/s),而是在~70% 的最大值 (~79GB/s)
__kernel void add_vectors(int N,__global float *x,__global float const *b,float factor)
{
int gid = get_global_id(0);
if(gid < N)
x[gid]+=b[gid]*factor;
}
我计算这个特定内核每次运行的数据传输为 N * (2 + 1) * 4:
- N - 向量大小 = ~10,000,000
- 每个向量条目 2 次加载和 1 次存储
- 4 for sizeof float
我预计对于这样一个简单的内核,我需要更接近带宽限制,我错过了什么?
P.S.:我从相同算法的 CUDA 实现中得到相似的数字
【问题讨论】:
标签: cuda opencl linear-algebra gpgpu bandwidth