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