2015-11-22 3 views
-4

Linux 3.13.0-68-generic x86_64 Ubuntu 14.04.3 gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4Как использовать опцию vectorise в НКУ

У меня есть простая программа, я хочу использовать vectorise на самом деле.

#include <stdio.h> 
#include <sys/time.h> 
struct timeval stop, start; 

int main() { 
    int i; 

    int x[8192], y[8192]; 
    int a = 1, b = 2, c = 3; 

    gettimeofday(&start, NULL); 

    for (i = 0; i < 8192; i++) { 
      y[i] = a * x[i] * x[i] + b * x[i] + c; 
    } 

    gettimeofday(&stop, NULL); 

    printf("%d us\n", stop.tv_usec - start.tv_usec); 

     for (i = 0; i < 8192; i++) { 
     printf("%d\r", y[i]); 
     } 
    return 0; 
} 

Если я использую

-O0 время является 30 us

-O1 время является 3 us

-O2 время является 1 or 0 us

, но если я использую

-finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-loop-distribute-patterns -ftree-slp-vectorize -fvect-cost-model -ftree-partial-pre -fipa-cp-clone -ftree-vectorize

Все эти опции vectorise я могу найти, но потребление времени такое же с -O0

что правильный вариант я должен использовать?

+3

'-O3' позволяет векторизации и несколько других вариантов. Ваша путаница других вариантов, вероятно, не даст желаемого эффекта, потому что вы не указали уровень оптимизации в сочетании с ними. – fuz

+1

Кроме того, ваша программа содержит неопределенное поведение, вполне вероятно, что компилятор вообще не выполняет никаких оптимизаций. Если бы я был вами, я бы постарался разработать лучший тестовый пример. – fuz

+0

Обратите внимание, что ваша программа вообще не использует результат вашего цикла, поэтому она является бесполезным эталоном, поскольку компилятор просто исключает цикл alltogether и просто выполняет 2 вызова gettimeofday и printf. Вы можете использовать 'gcc -S' для создания кода сборки и посмотреть, что происходит, для различных уровней оптимизации/флагов. – nos

ответ

0

gcc -O2 -ftree-vectorize -ftree-vectorizer-verbose=1 main.c

Вот результат:

main.c: In function ‘main’: 
main.c:19:3: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘__suseconds_t’ [-Wformat=] 
    printf("%d us\n", stop.tv_usec - start.tv_usec); 
^

Analyzing loop at main.c:21 

Analyzing loop at main.c:13 


Vectorizing loop at main.c:13 

main.c:13: note: LOOP VECTORIZED. 
main.c:5: note: vectorized 1 loops in function. 
Смежные вопросы