超執行緒

超執行緒（Hyper-Threading，縮寫 HT）是英特爾專有的同時多執行緒技術，於 2002 年發布，用來改進 x86 微處理器執行平行計算（一次執行多個任務）的能力。超執行緒技術原先只應用於英特爾 Xeon 處理器中，當時稱為 “Super-Threading”。之後陸續應用在 Pentium 4 HT 中，早期代號為 Jackson。

透過此技術，英特爾實現在一個實體 CPU 中，提供兩個邏輯執行緒。之後的 Pentium D 雖不支援超執行緒技術，但集成了兩個實體核心，所以仍會見到兩個執行緒。超執行緒的未來發展，是提升處理器的邏輯執行緒。英特爾於 2016 年釋出的 Core i7-6950X 便是將 10 核心的處理器，加上超執行緒技術，使之成為 20 個邏輯執行緒的產品。

英特爾表示，超執行緒技術讓 Pentium 4 HT 處理器增加 5% 的裸晶面積，就可以換來 15%~30% 的效能提升。但實際上，在某些程式或未對多執行緒編譯的程式而言，超執行緒反而會降低效能。除此之外，超執行緒技術亦要作業系統的配合，普通支援多處理器技術的系統亦未必能充分發揮該技術。例如 Windows 2000，英特爾並不鼓勵使用者在此係統中利用超執行緒。原先不支援多核心的 Windows XP Home Edition 卻支援超執行緒技術。

運作方式

每個單位時間內，一個單執行管線的 CPU 只能處理一個執行緒（作業系統：thread），以這樣的單位進行，如果想要在一單位時間內處理超過一個執行緒是不可能的，除非是有兩個 CPU 的實體單元。雙核心技術是將兩個一樣的 CPU 放置於一個封裝內（或直接將兩個 CPU 做成一個晶片），而英特爾的 HT 技術是在 CPU 內部僅複製必要的資源、讓兩個執行緒可同時執行；在一單位時間內處理兩個執行緒的工作，模擬實體雙核心、雙執行緒運作。

Intel 自 Pentium 開始引入超純量、亂序執行、大量的暫存器及暫存器重新命名、多指令解碼器、預測執行等特性；這些特性的原理是讓 CPU 擁有大量資源，並可以預先執行及平行執行指令，以增加指令執行效率，可是在現實中這些資源經常閒置；為了有效利用這些資源，就乾脆再增加一些資源來執行第二個執行緒，讓這些閒置資源可執行另一個執行緒，而且 CPU 只要增加少數資源就可以模擬成兩個執行緒運作。

P4 處理器需多加一個 Logical CPU Pointer（邏輯處理單元）。因此 P4 HT 的 die 的面積比以往的 P4 增大了 5%。而其餘部分如 ALU（整數運算單元）、FPU（浮點運算單元）、L2 Cache（二級快取）並未增加，且是共享的。

使用 HT 技術的 CPU

Pentium 4 CPU 中，Northwood 及其之後推出的版本內建超執行緒技術；而雙核心的 Pentium D 中也只有 EE 版提供 HT 技術。英特爾的 Core 2 處理器則沒有 HT 技術。

而在 2008 年推出的 Intel Core i7 處理器又支援 HT 技術，在 Nehalem 微架構中，Hyper-Threading 大舉捲土重來。Intel 的 Hyper-Threading（又稱同步多執行緒）是善用執行緒平行性的方法，讓單一核心在應用軟體層能執行兩個邏輯執行緒。超執行緒技術在部分型號 Intel Core i3/i5/i7/i9 處理器中可用。從 Kaby Lake Pentium 開始，定位低階的 Pentium（部分型號）也支援超執行緒技術。

顧慮

把執行管線的狀態，想像成流水線，資源 A→資源 B→資源 C，來了兩條資料要計算，一條需要消耗 A 的 100%→B 的 50%→C 的 50%，另一條一樣需要消耗 A 的 100%→B 的 50%→C 的 50%，一條單純的（無 HT）的執行管線的資源 A 需要先運用 100% 效能把第一條運算完才能再運算下一條，但後面的資源 B 跟 C 卻都有 50% 效能的浪費；如果把執行管線的資源 A，變成兩個，資源 B 跟 C 依然只有一個，那這條管線就可以變成「兩個資源 A 同時消耗 100% 效能運算兩條資料，到了資源 B 跟 C 階段時，兩條資料再各自消耗 50% 的效能」，即達成「不必增加一條完整的執行管線，卻能在一樣時間運算兩條執行緒」。

但實際應用時，執行管線不會都是收到這麼完美的需運算資料，可能會是需消耗「A 的 10%→B 的 70%→C 的 70%」+「A 的 30%→B 的 50%→C 的 70%」+...... 等多種不同效能需求的需運算資料，依照檔案的統計數字，整體能夠提升的效能約為 5~15% 左右，且萬一發生資源互搶的情形時，整體效能反而會下降。

要令電腦支援超執行緒技術，通常需作業系統和硬體的配合。晶片組需要支援具有 HT 技術之處理器。為此，當時的 Intel 推出了新的晶片組，i865PE 和 i875P。要充分發揮超執行緒的效能，使用者要使用 Windows 2000 之後的作業系統，而 Windows XP 家用版亦支援超執行緒技術。除了微軟的 Windows 外，Linux kernel 2.4.x 亦開始支援該技術。軟體方面，通常最佳化多執行緒的程式都可以支援到。早期，遊戲軟體的支援是比較少。但隨著多核心技術的普及，愈來愈多遊戲軟體支援多執行緒的處理器。

安全

2005 年 5 月，Colin Percival 演示了 Pentium 4 上的超執行緒可以使用基於時間的側通道攻擊來監控與其共享快取的另一個執行緒的記憶體訪問模式，從而竊取密碼資訊。 這實際上不是計時攻擊，因為惡意執行緒只測量自己執行的時間。 對此的潛在解決方案包括處理器更改其快取逐出策略或作業系統阻止在同一物理核心上同時執行具有不同許可權的執行緒。2018 年，OpenBSD 作業系統停用了超執行緒，以避免資料可能從應用程式洩漏到其他軟體，原因是 Foreshadow/L1TF 漏洞。2019 年，一系列漏洞導致安全專家建議在所有裝置上停用超執行緒。

示例：獲取物理核心數與邏輯核心數

Windows API 的 GetLogicalProcessorInformation 可獲取當前計算機的物理核心數邏輯核心數：

DWORD GetProcessorCoreCount (DWORD &PhysicalProcessorCoreCount,DWORD &LogicalProcessorCoreCount)

{typedef BOOL (WINAPI *LPFN_GLPI)(

		PSYSTEMLOGICALPROCESSOR_INFORMATION,

		PDWORD);

	LPFNGLPI glpi = (LPFNGLPI) GetProcAddress (GetModuleHandle (TEXT ("kernel32")), "GetLogicalProcessorInformation");

	if (NULL == glpi)

		return 0;

	PSYSTEMLOGICALPROCESSOR_INFORMATION buffer = NULL;

	DWORD returnLength = 0;

	 PhysicalProcessorCoreCount = 0;

	 LogicalProcessorCoreCount = 0;

	while (true)

	{DWORD rc = glpi (buffer, &returnLength);

		if (FALSE == rc)

		{if (GetLastError == ERRORINSUFFICIENTBUFFER)

			{if (buffer)

					free (buffer);

				buffer = (PSYSTEMLOGICALPROCESSOR_INFORMATION) malloc (returnLength);

				if (NULL == buffer)

					return 0;

			}

			else

			{return 0;}

		}

		else

		{break;}

	}

	PSYSTEMLOGICALPROCESSOR_INFORMATION ptr = buffer;

	DWORD byteOffset = 0;

	while (byteOffset + sizeof (SYSTEMLOGICALPROCESSOR_INFORMATION) Relationship)

		{

		case RelationProcessorCore:

		{

			++PhysicalProcessorCoreCount;

			//count the logical processor, which is equal the count of digital 1's of ptr->ProcessorMask

			ULONG_PTR ProcessorMask = ptr->ProcessorMask;

			while (ProcessorMask != 0)

			{

				ProcessorMask &= ProcessorMask - 1;

				LogicalProcessorCoreCount++;

			}

			break;

		}

		default:

			break;

		}

		byteOffset += sizeof (SYSTEMLOGICALPROCESSOR_INFORMATION);

		++ptr;

	}

	free (buffer);

	return -1;

}

上述程式碼在 32 位編譯時最多能列舉 32 個邏輯核心，在 64 位編譯時最多列舉 64 個邏輯核心。如果超過 64，應該使用 processor group.