Я пытался векторизовать цикл, содержащий использование функции 'pow' в математической библиотеке. Я знаю, что компилятор Intel поддерживает использование 'pow' для инструкций sse - но я не могу заставить его работать с gcc (я думаю). Это тот случай, с которым я работаю:
int main(){
int i=0;
float a[256],
b[256];
float x= 2.3;
for (i =0 ; i<256; i++){
a[i]=1.5;
}
for (i=0; i<256; i++){
b[i]=pow(a[i],x);
}
for (i=0; i<256; i++){
b[i]=a[i]*a[i];
}
return 0;
}
Я собираю следующее:
gcc -O3 -Wall -ftree-vectorize -msse2 -ftree-vectorizer-verbose=5 code.c -o runthis
Это на OS X 10.5.8 с использованием gcc версии 4.2 (я также использовал 4.5 и не мог сказать, что-нибудь векторизовал - так как он вообще ничего не выводил). Похоже, что ни один из циклов не векторизован - есть проблема с выравниванием или какая-то другая проблема, которую мне не нужно использовать restrict? Если я напишу один из циклов как функцию, я получу более подробный вывод (код):
void pow2(float *a, float * b, int n) {
int i;
for (i=0; i<n; i++){
b[i]=a[i]*a[i];
}
}
Вывод
(с использованием подробного вывода уровня 7):
note: not vectorized: can't determine dependence between *D.2878_13 and *D.2877_8
bad data dependence.
Я посмотрел на страницу auto-vectorization *1013* gcc, но это не очень помогло. Если невозможно использовать pow в gcc-версии, что я могу найти в ресурсе для выполнения функции, эквивалентной pow (я в основном имею дело с целочисленными степенями).
Редактировать так что я просто копался в другом источнике - как он это векторизовал?!:
void array_op(double * d,int len,double value,void (*f)(double*,double*) ) {
for ( int i = 0; i < len; i++ ){
f(&d[i],&value);
}
};
Соответствующий вывод gcc:
note: Profitability threshold is 3 loop iterations.
note: LOOP VECTORIZED.
Ну, теперь я в растерянности - 'd' и 'value' модифицируются функцией, о которой gcc не знает - странно? Может быть, мне нужно проверить эту часть более тщательно, чтобы убедиться, что результаты верны для векторизованной части. Все еще ищете векторизованную математическую библиотеку - почему нет открытых библиотек?