问题标签 [hyperthreading]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4221 浏览

rendering - 超线程……让我的渲染器慢了 10 倍

执行摘要:如何在他的代码中指定 OpenMP 应该只将线程用于 REAL 内核,即不计算超线程内核?

详细分析:多年来,我在空闲时间编写了一个纯软件的开源渲染器(rasterizer/raytracer)。GPL 代码和 Windows 二进制文件可从此处获得: https ://www.thanassis.space/renderer.html 它在 Windows、Linux、OS/X 和 BSD 下编译和运行良好。

上个月我介绍了一种光线追踪模式 - 生成的图片质量飙升。不幸的是,光线追踪比光栅化慢几个数量级。为了提高速度,就像我对光栅化器所做的那样,我为光线追踪器添加了 OpenMP(和 TBB)支持 - 以轻松利用额外的 CPU 内核。光栅化和光线追踪都可以轻松地进行线程处理(每个三角形的工作量 - 每个像素的工作量)。

在家里,使用我的 Core2Duo,第二个核心帮助了所有模式 - 光栅化和光线追踪模式都获得了 1.85x 和 1.9x 之间的加速。

问题:当然,我很想看到顶级 CPU 性能(我也“玩”过 GPU,初步 CUDA 端口),所以我想要一个坚实的比较基础。我把代码给了我的一个好朋友,他可以使用一台“野兽”机器,它有一个 16 核、1500 美元的英特尔超级处理器。

他以“最重”模式运行它,光线追踪器模式......

...他的速度是我的 Core2Duo 的五分之一(!)

喘息——恐怖。刚才发生了什么?

我们开始尝试不同的修改、补丁……最终我们弄明白了。

通过使用 OMP_NUM_THREADS 环境变量,可以控制产生多少 OpenMP 线程。随着线程数从 1 增加到 8,速度也在增加(接近线性增加)。我们越过 8 的那一刻,速度开始下降,直到它急剧下降到我的 Core2Duo 速度的五分之一,当所有 16 个核心都用完时!

为什么是8?

因为 8 是真正的核心数。其他 8 个是……超线程的!

理论:现在,这对我来说是个新闻——我已经看到超线程在其他算法中的帮助很大(高达 25%),所以这是出乎意料的。显然,即使每个超线程内核都有自己的寄存器(和 SSE 单元?),光线追踪器也无法利用额外的处理能力。这让我想到...

饥饿的可能不是处理能力 - 它是内存带宽。

光线追踪器使用包围体层次结构数据结构来加速光线与三角形的交点。如果使用超线程内核,那么一对中的每个“逻辑内核”都试图从该数据结构中的不同位置(即内存中)读取 - 并且 CPU 缓存(每对本地)被完全颠簸。至少,这是我的理论——欢迎提出任何建议。

所以,问题是: OpenMP 检测“核心”的数量并产生与之匹配的线程——也就是说,它在计算中包含了超线程“核心”。就我而言,这显然会在速度方面导致灾难性的结果。有谁知道如何使用 OpenMP API(如果可能,可移植)只为 REAL 内核生成线程,而不是超线程内核?

PS 代码是开放的 (GPL) 并且可以在上面的链接中找到,请随意在您自己的机器上复制 - 我猜这将发生在所有超线程 CPU 中。

PPS 请原谅帖子的长度,我认为这是一种教育经验并想分享。

0 投票
2 回答
159 浏览

hyperthreading - 我需要一个简短的 C 程序,它在有超线程的处理器上比没有它的处理器上运行得慢

我想用 Compiler Optimizations for HyperTreading 写一篇论文。第一步是调查为什么具有超线程(同时多线程)的处理器会导致比没有这种技术的处理器更差的性能。第一步是找到一个在没有超线程的情况下更好的应用程序,这样我就可以在它上面运行一些硬件性能计数器。关于如何或在哪里可以找到的任何建议?

所以,总结一下。我知道超线程的好处在 -10% 到 +30% 之间。我需要一个性能降低 10% 的 C 应用程序。

谢谢。

0 投票
1 回答
269 浏览

multithreading - Indy Sockets 在超线程机器上逐渐变慢

这是一个很长的镜头,但也许有人有一个想法。我正在使用 IndySockets,这是一个在多线程(20-25 线程)网络爬虫应用程序中扩展 .Net 套接字类的库。该应用程序在许多不同的服务器上运行,其中一些已打开超线程。

使用超线程一开始大大提高了应用程序的效率(速度提高了 30-50%),但是这些机器上的 IndySockets 调用在几天内逐渐变得越来越慢。这不会发生在不使用超线程的机器上。

更令人困惑的是,重新启动超线程机器似乎可以解决问题,即应用程序将以最初的速度运行,重新启动后再次以非常快的速度运行。重新启动应用程序没有任何效果。

如果有人有任何建议,我将不胜感激。谢谢。

0 投票
3 回答
2070 浏览

c# - 超线程是否有效?

我在我的 PC 上运行了一些相当消耗处理器的东西,并注意到我的 CPU 使用率看起来很奇怪。我的电脑是四核 i7-870,据说有八个虚拟内核。
我在 .NET 4 中使用 Task Parallel 库,所以希望所有内核都能得到很好的利用,但我从 Process Monitor 获得了这样的信息:

CPU使用率

核心 6 和 8 几乎没有被触及,除了短暂的爆发之外,4 也没有。
这是我应该期待的吗?

0 投票
3 回答
4042 浏览

c++ - Visual Studio 2010,超线程处理器的最大并发 C++ 编译

我正在尝试优化大型 VC++ 项目的编译时间。我的处理器是 Core i7 950(4 核,8 线程,因为它支持英特尔超线程技术)。

在 Microsoft Visual Studio 2010 中,如果您转到工具>选项>项目和解决方案>VC++ 项目设置>最大并发 C++ 编译

您可以选择用于并行 C++ 编译的最大 CPU 内核数。我在那里选择了 0(这样我的所有核心都被使用了),这与使用 4 或 8 时产生的结果完全相同。

现在,如果我在编译项目时打开任务管理器,我可以看到 4 个并行编译线程正在运行(在进程下它们有描述:Microsoft C/C++ Compiler Driver),并且总 CPU 使用率略低于50% 一直。

所以我的问题是:

四核超线程处理器中是否可以有 8 个并行编译线程?如果这是不可能的,那么是否有可能在编译时以某种方式使用接近 100% 的处理器能力?

这将为我节省大量时间。

非常感谢您,

尼古拉斯

0 投票
0 回答
540 浏览

hyperthreading - 超线程性能和游戏服务器

我很难找到一些关于它的确凿事实,而且我自己也无法真正运行任何基准测试,所以我想我会在这里问:

超线程会降低运行多个单线程 CPU 密集型应用程序的机器的性能吗?在我的例子中,它是一个至强四核,运行大约 6 个游戏服务器,其中 5 个在 Source 引擎上。

我的社区领导同事一直坚持认为,在服务器上禁用 HT 将有利于其性能。有没有人有事实可以证实或驳回他的主张?

0 投票
6 回答
20067 浏览

linux - Linux找出超线程核心ID

我今天早上试图找出如何确定哪个处理器 id 是超线程核心,但没有运气。

我希望找出这些信息并用于set_affinity()将进程绑定到超线程线程或非超线程线程以分析其性能。

0 投票
1 回答
6903 浏览

linux-kernel - 如何在内核模块中找到物理和逻辑核心号?

Linux 中是否有内核函数可以返回内核模块正在运行的物理内核和逻辑内核(在超线程的情况下)的数量?

0 投票
4 回答
1777 浏览

c++ - 如何在 C++ 程序中通过拓扑考虑在多核 HT 上实现亲和性?

我正在开发一些具有可变线程数的 C++ 多核程序,我想知道如何设置适当的(实际上是“最好的”)亲和力。我使用 Boost-threads,所以我可以调用 get_hardware_concurrency() 来了解有多少逻辑内核。到现在为止,我写了一个映射“n_th thread to n-th logical core”,但这并不是最聪明的事情,因为多插槽处理器和超线程。我的程第 2 个物理上的第 1 个逻辑,...,第 n 个物理上的第 1 个逻辑,第 1 个物理上的第 2 个逻辑等等。

我发现很多东西都在讨论如何发现 HT 是否启用(CPUID)以及如何确定每个包的逻辑和物理核心。我知道我必须处理一些汇编代码,这并没有吓到我,但我真的不知道如何了解有关逻辑核心、物理核心和包的完整信息以及操作系统如何处理所有这些信息。

作为最简洁的我:我怎么知道操作系统(Windows和Linux)称为N-th的线程的确切位置(物理核心和包)?

0 投票
1 回答
1796 浏览

linux-kernel - 为什么线程的状态正在运行但它不使用任何 CPU?

今天发现了一个很奇怪的问题。我运行的是 Redhat Enterprise Linux 6,CPU 是 Intel E31275(4 核,8 线程)。我发现一个内核线程(我称之为 my_thread)不能正常工作。使用“ps”命令,我发现 my_thread 的状态一直在运行:

但它的运行时间始终是 3 点 14 分。既然它正在运行,为什么总时间没有增加?从 proc 文件 /proc/5545/sched 中,我发现该线程的所有统计信息(包括唤醒计数 (se.nr_wakeups))也始终相同。

从 /proc/5545/stack 中,我发现这个线程调用了这个函数并且从未返回:

理论上,如果没有其他线程唤醒该线程,该函数将每 3 秒返回一次。每次函数返回后,/proc/5545/sched 中的 se.nr_wakeups 都会增加 1。但是在我发现线程有问题之后,这种情况就再也没有发生过。

有没有人有一些想法?interruptible_sleep_on_timeout() 是否有可能永远不会返回?

更新:如果我为此线程设置 CPU 亲和性,我发现问题不会发生。如果我把它固定到一个专用的核心上,那么一切都很好。SMP调度有问题吗?

再次更新:我在BIOS中禁用超线程后,直到现在我才看到这样的问题。