linux - 如果 256 个线程比 8 个线程提供更好的性能,我可能采用了错误的方法吗?

标签 linux performance multithreading posix

我刚刚开始在双核 x86_64 Linux 系统上使用 POSIX 线程进行编程。按照我的做法,256 个线程似乎是性能的最佳选择。我想知道这怎么可能?如果这可能意味着我的方法是错误的,而更好的方法将需要更少的线程并且同样快或更快?

有关更多背景信息(所讨论的程序是多线程 M 集图像生成器的框架),请参阅我已经提出的以下问题:

Using threads, how should I deal with something which ideally should happen in sequential order?

How can my threaded image generating app get it’s data to the gui?

也许我应该提到骨架(我在其中复制了用于测试和比较的最小功能)现在正在显示图像,并且实际计算的速度几乎是非线程程序的两倍。

因此,如果 256 个线程的运行速度快于 8 个线程并不表示线程处理方法不佳,那么 256 个线程的性能为何优于 8 个线程?

速度测试用例是 Mandelbrot Set 的一部分位于:

xmin -0.76243636067708333333333328
xmax -0.7624335575810185185185186
ymax 0.077996663411458333333333929

计算最多 30000 次迭代。

关于non-threaded version我系统上的渲染时间约为 15 秒。在线程版本上,8 个线程的平均速度为 7.8 秒,而 256 个线程为 7.6 秒。

最佳答案

嗯,可能是的,你做错了什么。

但是,在某些情况下,256 个线程比 8 个线程运行得更好,而线程模型不一定不好。必须记住,拥有 8 个线程并不意味着所有 8 个线程实际上一直在运行。任何时候一个线程对操作系统进行阻塞系统调用,该线程将停止运行并等待结果。与此同时,另一个线程通常可以完成工作。

有这样一种说法,即在 CPU 上使用的线程数量不能超过上下文数量,但事实并非如此。如果您的线程阻塞在系统调用上,那么让另一个线程可用于完成更多工作可能至关重要。 (实际上,当线程阻塞时,要做的工作往往会减少,但情况并非总是如此。)

这完全取决于工作负载,并且没有适合任何特定应用程序的正确线程数。通常,您永远不希望可用线程数少于操作系统运行的线程数,这是唯一正确的规则。 (不幸的是,这很难发现,因此人们倾向于启动与上下文一样多的线程,然后尽可能使用非阻塞系统调用。)

关于linux - 如果 256 个线程比 8 个线程提供更好的性能,我可能采用了错误的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2040036/

相关文章:

java - jar 在 unix 和 linux 中的行为是否不同?

linux - 使用 Bash 脚本读取文件求平均值

linux - 查询最近卸载的rpm包

performance - 具有多个 WHERE 等式的 Postgresql CREATE TABLE AS

java - 如何加快List的迭代速度

php - mysql查询性能提升

c - scanf 没有被调用

java - Java中原子等待的实现

c++ - boost::this_thread::sleep_用于使整个程序休眠

android - 在 android 后台收集和保存大量数据的最有效方法