Att automatiskt utnyttja korta vektoranvisningar (SSE, AVX, NEON) är en mycket viktig uppgift för att optimera kompilatorer. Vektorinstruktioner fungerar vanligtvis bäst på data som är sammanhängande i minnet, och att arbeta på icke-kontigerande data kräver ytterligare arbete för att samla in och sprida data. Det finns flera varianter av icke-kontinuerlig åtkomst, inklusive interleaded data access. En befintlig metod som används av GCC genererar extremt effektiv kod för loopar med power-of-2 interleaving faktorer (strider). I detta dokument föreslår vi en generalisering av detta tillvägagångssätt som producerar liknande kod för alla kompilerings-tid konstant interleating faktor. Dessutom föreslår vi flera nya programomvandlingar, som möjliggjordes genom vår generaliserade representation av problemet. Experiment visar att vår strategi uppnår betydande hastigheter för både power-of-2 och non-power-of-2 interleaving faktorer. Vår vektoriseringsmetod resulterar i genomsnittliga hastigheter över skalär kod på 1,77x på Intel SSE och 2,53x på Intel AVX2 i verkliga benchmarking på ett urval av BLAS nivå 1 rutiner. På samma benchmarkingprogram uppnår GCC 5.0 genomsnittliga förbättringar på 1,43x på Intel SSE och 1,30x på Intel AVX2. I syntetisk benchmarking på Intel SSE, vår maximala förbättring på datarörelser är över 4x för insamling av operationer och över 6x för spridning verksamhet kontra skalar kod.
Senare, Anderson et al. generaliserade tidigare arbete för någon konstant interleaving faktor REF.
Automatic Vectorization of Interleaved Data Revisited
{'venue': 'TACO', 'journal': None, 'mag_field_of_study': ['Computer Science']}