大多数论文都显示了flops / Gflops并为其CUDA内核实现了带宽。我还在stackoverflow上阅读了以下问题的答案:
How to evaluate CUDA performance?
How Do You Profile & Optimize CUDA Kernels?
How to calculate Gflops of a kernel
Counting FLOPS/GFLOPS in program - CUDA
How to calculate the achieved bandwidth of a CUDA kernel
大多数事情看起来都不错,但仍然不能让我在计算这些事情时感到舒服。任何人都可以写一个简单的CUDA内核吗?然后给出deviceQuery的输出。然后逐步计算flops / Gflops并为此内核实现带宽。然后显示此内核的Visual Profiler结果。即对于这个简单的CUDA内核,逐步获得所有信息,详细显示结果。这对我们大多数人来说真的很有帮助。谢谢!
答案 0 :(得分:1)
Nsight Visual Studio Edition 2.1及以上
如果您收集已实现的FLOPS 实验和内存统计 - 缓冲区实验,则可以获得您请求的信息。
Visual Profiler 4.2及以上
实现带宽:当鼠标悬停在时间轴中的内核上时,此信息可在内存\ DRAM利用率下的属性窗格中找到。
探查器尚无法收集FLOPS计数。这可以通过运行cuobjdump -sass来查看汇编代码来完成。逐步执行内核并计算单精度和双精度浮点指令,将FMA和DFMA运算乘以2.每条指令也应乘以谓词的真实线程。您还必须考虑控制流程。这并不好玩,需要对指令集有很强知识的人。通过在调试器中单步执行程序集可以更好地完成此操作。内核的持续时间在Visual Profiler属性窗格和详细信息窗格中可用作持续时间。
答案 1 :(得分:0)
您可以在Optimizing Parallel Reductions in CUDA中跟踪Mark Harris的计算结果。在那里,他使用输入数据作为基础,并在内核执行时划分它。在示例中,他使用了2 ^ 22个整数,因此他有0,016777216 GB的输入数据。第一个内核耗时8,054 ms,实现的带宽为2,083 GB / s。
经过多次优化后,他接近62,671 GB / s,并将其与所用GPU的峰值性能(86,4 GB / s)进行了比较。
虽然他使用了int,你可以很容易地将其改编为flops / Gflops。