【发布时间】:2015-03-23 23:29:43
【问题描述】:
我有一个数字密集型应用程序,在互联网上寻找 GFLOPS 后,我决定做自己的小基准测试。我只是做了数千次单线程矩阵乘法以获得大约一秒钟的执行时间。这是内部循环。完整的
for (int i = 0; i < SIZEA; i++)
for (int j = 0; j < SIZEB; j++)
vector_out[i] = vector_out[i] + vector[j] * matrix[i, j];
我处理 FLOPS 已经有好几年了,所以我预计每个 FLOP 会得到大约 3 到 6 个周期。但是我得到了 30(100 MFLOPS),当然如果我并行化这个我会得到更多,但我只是没想到会这样。这可能是 dot NET 的问题吗?还是这真的是 CPU 性能?
这是带有完整基准代码的fiddle。
编辑:即使在发布模式下,Visual Studio 也需要更长的时间来运行,可执行文件本身在每个 FLOP (250 MFLOPS) 中运行 12 个周期。仍然有任何 VM 影响吗?
【问题讨论】:
-
鉴于 C# 编译为 IL,最终将转换为 x86、x64 或各种 ARM(仅举三例)架构,对此没有单一的答案。如果性能至关重要,那么 C# 不是(这部分)工作的正确工具。
-
@Damien_The_Unbeliever 的评论是正确的(应该是 IMO 的答案)。这将取决于目标架构。
-
@Damien 和 mura,这就是问题所在,架构有多少,点网有多少。在这样一个简单的代码中,我们可能正在以与熨斗相同的速度运行。
-
您令人失望的结果更多来自
vector_out[i]由i < SIZEA保护。学习正确使用 C#,这是(转换后的)C 代码。
标签: c# benchmarking flops