SSE-векторизация математической функции 'pow' gcc

Я пытался векторизовать цикл, содержащий использование функции '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 и не мог сказать, векторизован ли он ничего - поскольку он вообще ничего не выводил). Похоже, что ни один из циклов не векторизуется - есть ли проблема с выравниванием или какая-то другая проблема, которую мне нужно использовать, чтобы ограничить? Если я напишу один из циклов как функцию, я получу немного более подробный вывод (код):

void pow2(float *a, float * b, int n) {
        int i;
        for (i=0; i

output (с использованием подробного вывода уровня 7):

note: not vectorized: can't determine dependence between *D.2878_13 and *D.2877_8
bad data dependence.

Я просмотрел страницу gcc auto-vectorization но это мало помогло. Если невозможно использовать 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 не делает знать про - странно? Возможно, мне нужно проверить эту часть более тщательно, чтобы убедиться, что результаты верны для векторизованной части. Все еще ищите векторизованную математическую библиотеку - почему нет библиотек с открытым исходным кодом?

10
задан Marm0t 3 August 2011 в 01:59
поделиться