2014-05-05 01:23:17
HrPopCnt, czyli dostałem Haswella

Dopiero teraz dociera do mnie, ile fajnych bajerów tkwi w moim lunchboxie, a jednym z nich jest instrukcja POPCNT obsługiwana przez Core i3-4130T. A co robi ta instrukcja? Zlicza ilość zapalonych bitów w danym argumencie.

Zastosowań tego jest trochę, a sama funkcjonalność nie jest specjalnie trudna do zaimplementowania przez średnio rozgarniętego studencinę. Po co więc się w to pchać? Bo czemu nie? Dają procesor z taką funkcjonalnością, więc warto chociaż przetestować, czy zabawa jest w ogóle warta świeczki. Wojciech Muła w swoim artykule pokazuje, że nie trzeba SSE 4.2 do tego, jednak jest tu małe "ale" - w sytuacji gdy chce się policzyć ilość bitów w 32-bitowym integerze, ta metoda będzie wolna (działa na 16-tobajtowych blokach). Niemniej, warto o tym wspomnieć, gdy chce się pracować na blokach danych.

Pierwsze testy były dość zaskakujące, bo okazało się, że to działa absurdalnie szybko, 112 (sto dwanaście) razy szybciej od mojej pierwszej z brzegu implementacji. Stwierdziłem że to trochę za duży skok i zacząłem szukać jakiejś lepszej (kto by tam w majówkę wytężał umysł...), lądując ostatecznie na stronie Bit Twiddling Hacks, gdzie jest dużo gotowców z tych okolic. Ostatecznie, wersja pascalowa okazuje się wolniejsza od sprzętowej o jakieś 30% (różnica jest tym większa, im wolniej taktowany jest procesor z racji większej ilości instrukcji).

Po wszystkim pomyślałem sobie, że może komuś się to przyda? Opakowałem wszystko w Delphi'owy moduł, dodałem detekcję (via instrukcja CPUID) dostępności instrukcji POPCNT i wrzuciłem na Branchware. Użycie jest bardzo proste - dopisujemy HrPopCnt do swojej klauzuli "uses", a potem wywołujemy funkcję "popcnt" jako argument podając liczbę, w której ilość bitów chcemy zliczyć. Dzięki detekcji instrukcji POPCNT w procesorze, moduł działa poprawnie także na starszych procesorach, aczkolwiek nieco wolniej.


Może Cię zainteresować...

Powered by:
Hellcore Mailer - polski program pocztowyOpera Web BrowserFreeBSD - The Power to Serve!Slackware
RSSy:
Sidekick:
Projekty:
O autorze:
Zobacz:
Kategorie:
Archiwum:
Szukaj: