CLMUL

CLMUL (ang. carry-less multiplication) – rozszerzenie zestawu instrukcji procesorów x86, umożliwiające sprzętowe wykonywanie mnożenia binarnego bez przeniesień. Zostało opracowane przez firmę Intel i wprowadzone w 2010 roku w procesorach opartych na mikroarchitekturze Westmere. Rozszerzenie zostało następnie zaimplementowane również przez AMD, między innymi w mikroarchitekturze Bulldozer.

Działanie

Podstawową instrukcją rozszerzenia jest PCLMULQDQ, która mnoży bez przeniesień dwie 64-bitowe wartości i zapisuje 128-bitowy wynik w rejestrze XMM. Wartości te są wybierane z dwóch 128-bitowych operandów: rejestru XMM oraz rejestru XMM lub pamięci. O tym, które 64-bitowe połowy operandów zostaną pomnożone, decydują bity 0 i 4 argumentu natychmiastowego o długości 8 bitów. Obsługę PCLMULQDQ można wykryć za pomocą instrukcji CPUID, sprawdzając bit 1 rejestru ECX dla funkcji 1.

Matematycznie operacja odpowiada mnożeniu wielomianów o współczynnikach z dwuelementowego ciała skończonego GF(2). Dodawanie współczynników jest realizowane za pomocą operacji XOR, bez generowania ani propagowania przeniesień. Wykorzystanie wyniku do mnożenia w większych ciałach skończonych GF(2n) wymaga dodatkowej redukcji modulo odpowiedni wielomian nierozkładalny.

Wektorowa postać instrukcji, VPCLMULQDQ, występuje w wariantach 128, 256 i 512-bitowych. Warianty 256 i 512-bitowe wykonują odpowiednio dwa lub cztery niezależne mnożenia bez przeniesień, po jednym w każdej 128-bitowej części rejestru wektorowego.

Zastosowania

CLMUL przyspiesza obliczanie funkcji GHASH, wykorzystywanej do uwierzytelniania danych w trybie GCM, stosowanym między innymi z algorytmem AES. Instrukcja umożliwia również wydajniejsze obliczanie cyklicznych kodów nadmiarowych (CRC), służących do wykrywania błędów danych.

Przypisy

  1. 1 2 3 4 5 Shay Gueron, Michael E. Kounavis, Intel Carry-Less Multiplication Instruction and its Usage for Computing the GCM Mode [online], Intel, kwiecień 2014 [dostęp 2026-11-05] (ang.).
  2. ↑ Sean White, High-Performance Power-Efficient x86-64 Server and Desktop Processors Using the Core Codenamed „Bulldozer” [online], AMD, 19 sierpnia 2011, s. 12 [dostęp 2026-11-05] (ang.).
  3. ↑ Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 2: Instruction Set Reference, A–Z [online], Intel [dostęp 2026-11-05] (ang.).