在 Cuda 中计算 GFLOPS

标签 c cuda parallel-processing

我正在做一个 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/

相关文章:

c - 最后一行代码出现段错误

memory-management - 为现有全局内存阵列分配更多内存

optimization - 完全禁用 NVCC 上的优化

scala - 了解并行存在并查找

c - 使用带有 MPI 的 master-worker 时,哪个大小的 block 将产生最佳性能?

C指针转换

c - 使用 Unix 套接字获取 "Address already in use"错误

计算接收/发送数据的时间以计算带宽

c++ - 无法在 VS 2015 中编译 CUDA 代码

c - 使用 openmp 任务的部分并行循环