0

我有一个数字密集型应用程序,在互联网上寻找 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 性能吗?

这是完整基准代码的小提琴

编辑:即使在发布模式下,Visual Studio 也需要更长的时间来运行,可执行文件本身在每个 FLOP(250 MFLOPS)中运行 12 个周期。仍然有任何 VM 影响吗?

4

1 回答 1

2

您的基准并没有真正测量 FLOPS,它在 C# 中执行一些浮点运算和循环。

但是,如果您可以将代码隔离为仅重复浮点操作,您仍然会遇到一些问题。

您的代码应包含一些“预循环”以允许“抖动预热”,因此您无需测量编译时间。

那么,即使你这样做,

您需要在发布模式下编译并进行优化,并在已知一致的平台上从命令行执行您的测试。


在这里提琴

这是我的替代基准,

using System;
using System.Linq;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        const int Flops = 10000000;
        var random = new Random();
        var output = Enumerable.Range(0, Flops)
                         .Select(i => random.NextDouble())
                         .ToArray();
        var left = Enumerable.Range(0, Flops)
                         .Select(i => random.NextDouble())
                         .ToArray();
        var right = Enumerable.Range(0, Flops)
                         .Select(i => random.NextDouble())
                         .ToArray();

        var timer = Stopwatch.StartNew();
        for (var i = 0; i < Flops - 1; i++)
        {
            unchecked
            {
                output[i] += left[i] * right[i];
            }
        }

        timer.Stop();
        for (var i = 0; i < Flops - 1; i++)
        {
            output[i] = random.NextDouble();
        }

        timer = Stopwatch.StartNew();
        for (var i = 0; i < Flops - 1; i++)
        {
            unchecked
            {
                output[i] += left[i] * right[i];
            }
        }

        timer.Stop();

        Console.WriteLine("ms: {0}", timer.ElapsedMilliseconds);
        Console.WriteLine(
            "MFLOPS: {0}",
            (double)Flops / timer.ElapsedMilliseconds / 1000.0);
    }
}

在我的虚拟机上,我得到如下结果

ms: 73
MFLOPS: 136.986301...

请注意,我必须显着增加操作次数才能超过 1 毫秒。

于 2015-03-20T16:03:08.640 回答