我正在做一个 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?! 任何帮助表示赞赏。
最佳答案
如果你计算出几个低维的例子(纸和铅笔),你可以计算出矩阵乘法的浮点运算次数是
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 .
关于在 Cuda 中计算 GFLOPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20776197/