我正在研究一个cuda项目,我正在比较矩阵乘法的各种CUDA实现的性能。重点是我正在尝试计算GPU的GFLOPS,但我无法弄清楚如何做到这一点。我到目前为止,使用cuda事件管理了执行乘法所需的时间,如下所示:
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start);
MatrixMulKernel<<<dimGrid,dimBlock>>> (Ad, Bd, Cd, M, N, K);
cudaEventRecord(stop);
cudaEventSynchronize(stop);
float milliseconds = 0;
float seconds = 0;
float GFLOPS=0;
cudaEventElapsedTime(&milliseconds, start, stop);
seconds = milliseconds * pow((float) 10,-3);;
是否有某种方程来计算GFLOPS?! 任何帮助表示赞赏。
答案 0 :(得分:1)
如果你计算出一些低维度的例子(纸和铅笔),你可以弄清楚矩阵乘法的浮点运算数是
long NumOps = N*N*(2*N-1);
我简单地假设矩阵是N*N
。练习:将其推广到矩阵A(尺寸,N1 * N2)和B(尺寸,N2 * N3)的任意数组大小。给A*B
(尺寸为N1 * N3)。
请记住,在关于该主题的文献中,当对矩阵乘法进行分析时,浮点运算的数量O(N^3)
通常简单地被视为NumOps = N^3
。因此,如果您将结果与其他已发布的值进行比较,请记住这一点。
无论哪种方式,Gflops都可以计算为:
float gflops = (float)NumOps/time_per_multiply_inSec/1e+9;
还有一些good notes here。