Автоматическая векторизация условных выражений оптимизирующим компилятором Ермолицкий Александр Викторович ermolitsky@gmail.com Векторизация линейного кода for( i=0; i<N; i++ ) for( i=0; i<N; i+=8 ) c[i] = a[i] + b[i]; c[i…i+7] = PADDB( a[i…i+7], b[i…i+7]); a LDb LDd LDb LDd ADDs PADDB STb STd b + + + + + + + + + + c Векторизация условного кода for( i=0; i<N; i++ ) c[i] = (a[i] > 0) ? a[i] : b[i]; 1 2 1 3 2 3 4 гамак 4 линейный участок Сведение потоков данных for( i=0; i<N; i++ ) c[i] = (a[i] > 0) ? a[i] : b[i]; Сведение потоков данных в скалярном цикле a[i] CMP merge c[i] b[i] Сведение потоков данных в векторизованном цикле a[i...i+7] PCMP AND b[i...i+7] ANDN OR c[i...i+7] Векторные предикаты Pn Pn Pcmp= PCMP… true Pe = Pn Pe1 Pe2 PeN … false Pe(t) Pe(f) Pe(f) = Pn & ~Pcmp Pn = Pe1 | Pe2 | … | PeN Pe(t) = Pn & Pcmp R1 Pe1 R2 Pe2 RN … PeN R0 = (R1 & Pe1) | (R2 & Pe2) | … | (RN & PeN) Схема векторизации цикла for( i=0; i<N; i++ ) c[i] = (a[i] > 0) ? a[i] : b[i]; • анализ возможности векторизации for( i=0; i<N; i+=8 ) { c[i+0] = (a[i+0] > 0) ? a[i+0] : b[i+0]; • определение фактора раскрутки c[i+1] = (a[i+1] > 0) ? a[i+1] : b[i+1]; • эвристика … • раскрутка цикла • генерация векторных операций c[i+7] = (a[i+7] > 0) ? a[i+7] : b[i+7]; } • удаление скалярных операций и узлов УГ цикла for( i=0; i<N; i+=8 ) { R1 = PCMPGTB( a[i…i+7], 0 ); R2 = a[i…i+7] & R1; R3 = b[i…i+7] & ~R1; c[i…i+7] = R2 | R3; } Частные случаи for( i=0; i<N; i++ ) { for( i=0; i<N; i++ ) { if( a[i] > 0 ) if( a[i] > 0 ) b[i] = a[i]; res = 1; } } for( i=0; i<N; i+=8 ) { R2 = 0; R1 = PCMPGTB( a[i…i+7], 0 ); R2 = a[i…i+7] & R1; R1 = PCMPGTB( a[i…i+7], 0 ); R3 = b[i…i+7] & ~R1; R2 = R2 | R1; b[i…i+7] = R2 | R3; } for( i=0; i<N; i+=8 ) { } if( R2 ) res = 1; Результаты 9 8,2 8 7 7,3 6,9 6 5 4,9 4 3,8 3 2 1 0 cond condST condExtSucc condInc satur Уменьшение количества исполняемых инструкций в результате генерации векторных операций Вопросы?