88 кб

advertisement
Автоматическая векторизация
условных выражений
оптимизирующим компилятором
Ермолицкий Александр Викторович
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
Уменьшение количества исполняемых инструкций в
результате генерации векторных операций
Вопросы?
Download