Jag kan inte komma pÄ hur man skulle kunna göra det effektivt pÄ det sÀtt du beskriver. Det gÄr inte att göra en gather pÄ 64 bytes alltsÄ mÄste man under parsning arrangera om datan. Hur hÄller du dÄ koll pÄ lÀngden pÄ varje report? Och hur skulle del 2 fungera?
Det enda man ska göra som har med tvÄ element i samma vektor Àr en subtraktion av nÀrliggande element. Det Àr en 3 latency vpermb för att skifta vektorn ett steg.
HÀr kommer ett lite mer detaljerat exempel hur man skulle kunna göra (skippar optimerad parsning):
AnvÀnder de tvÄ första exemplen frÄn uppgiften
LÀs in textfilen till en 1000 x 8 byte array sÄ att man fÄr 0 padding pÄ slutet.
[7 6 4 2 1 0 0 0 1 2 7 8 9 0 0 0 ...]
Flytta 64 bytes till ett vektor register
<7 6 4 2 1 0 0 0 1 2 7 8 9 0 0 0 ...>
LÀngden - 1 för varje enskilt report behövs senare och den fÄr man genom att anvÀnda vektor registret som ett 8 x 64 bitars och ta 7 - (lzcnt( 64 bitar ) >> 3). (leading zero count)
<4 4 ...>
Skifta en kopia av registret ett steg och subtrahera. (? Àr skrÀp frÄn nÀsta report som kommer maskas bort senare)
r1 = <7 6 4 2 1 0 0 0 1 2 7 8 9 0 0 0 ...>
r2 = <6 4 2 1 0 0 0 1 2 7 8 9 0 0 0 ? ...>
r1 - r2 = <1 2 2 1 1 0 0 -1 -1 -5 -1 -1 9 0 0 ? ...>
Skapa en mask som maskar bort allt utom de bitar man Àr intresserat av t.ex. genom att kombinera element i r2 som inte Àr 0 med en 7f7f... mask som maskar bort högsta byten i varje report.
<1 2 2 1 1 0 0 -1 -1 -5 -1 -1 9 0 0 ? ...>
<T TÂ TÂ T _ _ _ _ T T T T _ _ _ _ ...>
Nu kan man göra tvÄ maskade compares som kollar om elementen Àr mellan 1 och 3 eller mellan -1 och -3.
<1 2 2 1 1 0 0 -1 -1 -5 -1 -1 9 0 0 ? ...>
cmp1 = <T T T T _ _ _ _ _ _ _ _ _ _ _ _ ...>
cmp2 = <_ _ _ _ _ _ _ _ TÂ Â _ T T _ _ _ _ ...>
Sen flyttar man tillbaka maskerna till tvÄ vektor register. Det sÀtter alla bitar till 1 om masken Àr T. AlltsÄ fÄr man vÀrdet -1 pÄ bytes som var sanna och 0 pÄ de andra
<-1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 ...>
< 0 0 0 0 0 0 0 0 -1 0 -1 -1 0 0 0 0 ...>
Genom att tolka registret som ett 8 x 64 bit igen kan man ta en popcount för rÀkna antalet satta bitar per report.
cnt1 = <32 0 ...>
cnt2 = <0 24 ...>
Om man nu gör en compare mellan antalet satta bitar i bÄda registren och lÀngden man sparade tidigare gÄnger 8 sÄ fÄr man fram en mask som visar vilka reports som Àr safe.
len = < 4 4 ...>
x 8 = <32 32 ...>
cnt1 = <32 0 ...>
cnt2 = <0 24 ...>
m1 = <TÂ _ ...>
m2 = <_ _ ...>
Genom att göra en popcount pÄ m1 och m2 sÄ fÄr man antalet Safe reports.
Del tvÄ Àr i princip samma sak fast istÀllet för att lÀsa in 8 reports sÄ tar man en Ät gÄngen. Antingen genom en maskad load eller genom en inre loop som skiftar ner registret 8 bytes Ät gÄngen.
<1 3 2 4 5 0 0 0 0 ...>
Sen gör man en permute som sprider ut elementen i alla möjliga kombinationer av 7 element.
<3 2 4 5 0 0 0 0 1 2 4 5 0 0 0 0 1 3 4 5 0 0 0 0...>
Skillnaden frÄn del 1 Àr att man sen kollar om man fÄr minst en trÀff i antingen m1 eller m2 istÀllet för att rÀkna ihop alla trÀffar.
Det gÄr sÀkert att göra nÄgot smartare men att lösa problemet utan simd tar < 100us sÄ knappast vÀrt att lÀgga ner tid pÄ den hÀr typen av lösning.
Jag förstÄr vad du vill göra och, ja, det gÄr att göra, men det Àr fel
Koden skulle bli mycket krÄngligare Àn om du bara skrev rak kod som loopade över de Ätta records du fÄr in i ett register. Du mÄste till exempel skriva kod som kör bÄda grenarna av din if else och har k-register som kontrollerar vilka element som instruktionerna pÄverkar. Har du en if else i en if else-gren mÄste du se till att köra bÄda grenar dÀr ocksÄ. Det blir snabbt kombinatoriskt jobbigt. Med en maximal parallellitet pÄ 8 sÄ jag Àr tveksam till om det skulle gÄ snabbare över huvud taget att köra AVX512.
Den stora poÀngen med SIMD Àr ju att kunna operera pÄ mycket data i taget. Ta exempelvis ett filter som rÀknar ut nÄgot baserat pÄ R-, G- och B-vÀrden. DÄ ser man till att ladda R, G och B i olika register och kan köra 64 berÀkningar parallellt. Om inte indata passar i den formen det kom in, dÄ arrangerar man om det till nÄgot som passar bÀttre.
Det gÄr att göra som du föreslÄr men jag tror inte du skulle se den uppsnabbning du hoppas pÄ. Men, men, det skulle vara exotiskt och det var ju dÀr diskussionen startade