【问题标题】:Processing speed acting strange处理速度表现奇怪
【发布时间】:2014-02-25 01:58:16
【问题描述】:

这个简单的问题让我有点困惑。我有 2 个处理器,它们都可以在 33.0360723 中单独执行 10 亿次操作。 然而他们两个一起做 27.4996964 中的操作。

这对我来说毫无意义,如果一个处理器的任务时间是 X,那么它们两个在一起的时间不应该是 X/2 吗?

我的代码:

Function calc(ByVal i As Integer, ByVal result As String)
    Math.Sqrt(i)
    Return True

End Function
Sub Main()
    Dim result As String = Nothing


    Dim starttime As TimeSpan
    starttime = DateTime.Now.TimeOfDay
    For i = 0 To 1000000000
        calc(i, result)
    Next
    Console.WriteLine("A single processor runs 1 billion operations in: ")
    Console.WriteLine(DateTime.Now.TimeOfDay - starttime)



    starttime = DateTime.Now.TimeOfDay

    Parallel.For(0, 1000000000, Function(i) calc(i, result))

    Console.WriteLine("All your processors run 1 billion operations in: ")
    Console.WriteLine(DateTime.Now.TimeOfDay - starttime)
    Console.ReadLine()

End Sub

PS:我在 VB.net 中为此编写了代码。

【问题讨论】:

  • 显示代码!很可能您的示例在同步两个处理器方面的开销远大于实际工作。
  • 第二个处理器是超线程虚拟处理器吗?
  • 这是个好问题,不应该被关闭。

标签: vb.net cpu processor


【解决方案1】:

如果一个人可以在 30 分钟内步行 2 英里,那么 2 个人步行同样的 2 英里需要多长时间?

抛开所有的玩笑不谈,MSDN 上的文档说:执行一个 for(Visual Basic 中的 For)循环,其中迭代可以并行运行。这里的关键字是MAY

您让 CLR 完成工作,经验表明 .net CLR 并不总是按您想象的方式工作。

在我的情况下(复制粘贴代码)单处理器 - 21.495 秒,所有处理器:7.03 秒。我在 32 位 Windows 7 上有一个 i7 870 CPU。

【讨论】:

  • 你的玩笑实际上是无效的,每个人必须步行 1 英里才能走 2 英里的距离。
  • 至少它不会将循环优化为 nops(因为从未使用过结果——尽管这也需要认识到不可能出现异常 [值为非负数])。编译器(甚至是运行时环境)可能会破坏微基准。
【解决方案2】:

Parallel.For 中,迭代的顺序不一定与循环的顺序相同。

另外,您的函数的作用是 sqrt(i),这意味着一个处理器可能正在执行 sqrt(smallernumbers) 和另一个 sqrt(largernumbers)

简单的答案是每个处理器完成的工作并不完全是您给它们的全部工作的一半,因此它们不太可能相等。

一个处理器可能已经完成了更多的工作,而另一个可能已经完成了它的工作并等待另一个。或者,其中一个处理器可能已经被操作系统preempted 用来做一些重要的事情,而您的工作线程可能一直在等待。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    相关资源
    最近更新 更多