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
что правильный вариант я должен использовать?
'-O3' позволяет векторизации и несколько других вариантов. Ваша путаница других вариантов, вероятно, не даст желаемого эффекта, потому что вы не указали уровень оптимизации в сочетании с ними. – fuz
Кроме того, ваша программа содержит неопределенное поведение, вполне вероятно, что компилятор вообще не выполняет никаких оптимизаций. Если бы я был вами, я бы постарался разработать лучший тестовый пример. – fuz
Обратите внимание, что ваша программа вообще не использует результат вашего цикла, поэтому она является бесполезным эталоном, поскольку компилятор просто исключает цикл alltogether и просто выполняет 2 вызова gettimeofday и printf. Вы можете использовать 'gcc -S' для создания кода сборки и посмотреть, что происходит, для различных уровней оптимизации/флагов. – nos