【问题标题】:Calculate GFLOPS in Cuda在 Cuda 中计算 GFLOPS
【发布时间】:2013-12-25 19:42:56
【问题描述】:

我正在做一个 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?! 任何帮助表示赞赏。

【问题讨论】:

    标签: c cuda parallel-processing


    【解决方案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

    【讨论】:

    • 好的,我已经设法获得了操作的数量,但是每当我尝试打印时,矩阵乘法都不会执行,我会得到如下信息:parallel.exe 中 0x0ff4b971 处的未处理异常: 0xC0000005:访问冲突读取位置 0xcccccccc。这可能是 printf 的结果吗?!
    • 您正在访问地址 0x5。可能某些对象是 NULL 并且您可能已尝试取消引用它?用调试器运行你的程序,它应该更清楚发生了什么。具体来说,它会给你一个堆栈跟踪并告诉你变量的状态。
    • 检查并得到结果后确定,输出的范围应该是多少才能确保我得到正确的答案?!我得到的结果是 0.17,所以请指教。
    • @omarsafwany:怎么会有人回答这个问题?您还没有说矩阵的大小和类型以及您正在运行它的设备。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 2014-05-04
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多