Как векторизовать мой цикл с g ++?

Вводные ссылки, которые я нашел при поиске:

6.59.14 Конкретные прагмы2.100 Pragma Loop_OptimizeКак дать подсказку gcc о подсчете цикловСкажите gcc, чтобы конкретно развернуть циклКак форсировать векторизацию в C ++

Как вы можете видеть, большинство из них для C, но я подумал, что они могут работать и на C ++. Вот мой код:

template<typename T>
//__attribute__((optimize("unroll-loops")))
//__attribute__ ((pure))
void foo(std::vector<T> &p1, size_t start,
            size_t end, const std::vector<T> &p2) {
  typename std::vector<T>::const_iterator it2 = p2.begin();
  //#pragma simd
  //#pragma omp parallel for
  //#pragma GCC ivdep Unroll Vector
  for (size_t i = start; i < end; ++i, ++it2) {
    p1[i] = p1[i] - *it2;
    p1[i] += 1;
  }
}

int main()
{
    size_t n;
    double x,y;
    n = 12800000;
    vector<double> v,u;
    for(size_t i=0; i<n; ++i) {
        x = i;
        y = i - 1;
        v.push_back(x);
        u.push_back(y);
    }
    using namespace std::chrono;

    high_resolution_clock::time_point t1 = high_resolution_clock::now();
    foo(v,0,n,u);
    high_resolution_clock::time_point t2 = high_resolution_clock::now();

    duration<double> time_span = duration_cast<duration<double>>(t2 - t1);

    std::cout << "It took me " << time_span.count() << " seconds.";
    std::cout << std::endl;
    return 0;
}

Я использовал все подсказки, которые можно увидеть в комментариях выше, но я не получил никакого ускорения, как показывает пример выходных данных (с первым прогоном, который откомментировал это#pragma GCC ivdep Unroll Vector:

samaras@samaras-A15:~/Downloads$ g++ test.cpp -O3 -std=c++0x -funroll-loops -ftree-vectorize -o test
samaras@samaras-A15:~/Downloads$ ./test
It took me 0.026575 seconds.
samaras@samaras-A15:~/Downloads$ g++ test.cpp -O3 -std=c++0x -o test
samaras@samaras-A15:~/Downloads$ ./test
It took me 0.0252697 seconds.

Есть ли надежда? Или флаг оптимизацииO3 просто трюк? Любые предложения по ускорению этого кода (foo функция) добро пожаловать!

Моя версия G ++:

samaras@samaras-A15:~/Downloads$ g++ --version
g++ (Ubuntu 4.8.1-2ubuntu1~12.04) 4.8.1

Обратите внимание, что тело цикла является случайным. Мне не интересно переписывать его в какой-то другой форме.

РЕДАКТИРОВАТЬ

Ответ о том, что больше ничего нельзя сделать, также приемлем!

Ответы на вопрос(2)

Ваш ответ на вопрос