Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么三个线程比10+;_.net_Multithreading_Performance - Fatal编程技术网

.net 为什么三个线程比10+;

.net 为什么三个线程比10+;,.net,multithreading,performance,.net,Multithreading,Performance,我的问题是关于Windows环境下多线程处理的性能问题。 在测试了我的代码之后,我得到的结果是,增加线程的数量并不会提高并行计算的性能,并且在经过一些计算后会变得更少。发生了什么事?是否有可能找到最佳线程数的公式:F(处理器、内存..)=?您可以看看in.NET 4.0。如果您运行的是较旧版本的框架,则可以使用来避免手动创建线程的开销。这取决于线程正在执行的操作。如果它们主要受CPU限制,那么最佳线程数是每个处理器核1个。如果他们在等待内核响应的地方执行任何重要的IO,那么更多的线程将提高性能

我的问题是关于Windows环境下多线程处理的性能问题。
在测试了我的代码之后,我得到的结果是,增加线程的数量并不会提高并行计算的性能,并且在经过一些计算后会变得更少。发生了什么事?是否有可能找到最佳线程数的公式:F(处理器、内存..)=?

您可以看看in.NET 4.0。如果您运行的是较旧版本的框架,则可以使用来避免手动创建线程的开销。

这取决于线程正在执行的操作。如果它们主要受CPU限制,那么最佳线程数是每个处理器核1个。如果他们在等待内核响应的地方执行任何重要的IO,那么更多的线程将提高性能


当每个核心有多个线程时,会产生上下文切换开销,因此增加CPU限制计算的线程数将始终影响性能。

如果您正在寻找公式,则有:

在并行计算中使用多个处理器的程序的加速受到程序顺序部分所需时间的限制。例如,如果一个程序使用单处理器内核需要20个小时,而1个小时的特定部分无法并行化,而剩余的19个小时(95%)可以并行化,那么无论我们为并行执行该程序投入多少处理器,最短执行时间不能小于该关键1小时


很难给出一个精确的一般规则。通常,如果您经常等待(等待I/O左右),那么线程比内核多是有意义的。然而,如果你真的在计算东西,内核的数量是一个很好的数量。更多的线程不会使CPU更快,但它们确实会增加调度工作。

首先,由于CPU对并发执行的线程数量有硬件限制(例如,四核为4个,如果有超线程,则为2倍),因此通过创建比内核更多的线程,无法获得更好的性能。正如您所看到的,额外的线程实际上会降低性能,因为在单位时间内完成的工作保持不变的情况下,线程调度和同步的开销会增加


如果您想让运行时为您自动管理一些参数,那么这是一个非常好的起点,如果将来您发现有理由这样做,您可以进行显式控制。

10+线程不一定比3快的原因是每个线程都有相关的开销。这就是管理线程本身——确保每个线程都有适当的处理时间,并管理线程之间传递的数据

因此,线程越多,这种非处理开销就越大


如果您有一个四核处理器,那么三个线程中的每一个都可以在一个核心上100%的时间运行(这不是真的,但这只是一个例子)。但是,如果有9个线程,那么每个线程只能在一个内核上运行33%的时间-它必须与其他2个线程共享。管理这一点的开销意味着9个线程实际上比3个线程慢。

您使用的是什么CPU?它有多少内核?线程在做什么工作?这是一个没有HT的4核处理器,所以对于并行计算来说,4是你的最佳选择。这取决于你的代码。@garik,那么它实际上更具体地取决于你在做什么。超线程虚拟核共享缓存和执行单元,所以若你们的应用程序有效地利用了CPU和内存,那个么你们就不会从使用更多线程中得到任何好处。如果内存是碎片化的,并且存在大量缓存未命中,那么您可以从每个核心使用2个线程中获得一些性能提升。在某些情况下,禁用HT并只运行每个核心1个线程实际上更快。另外,如果你有一个半现代的图形适配器,你可以利用GPU进行并行处理,从而在CUDA上取得良好的效果。现代图形适配器有数百个内核,具有每秒多GB的内存吞吐量。它们的指令集有限,但对于许多浮点计算来说,它们的速度非常快。