Linki wprowadzające znalazłem podczas poszukiwania:Jak wektoryzować moją pętlę za pomocą g ++?
- 6.59.14 Loop-Specific Pragmas
- 2.100 Pragma Loop_Optimize
- How to give hint to gcc about loop count
- Tell gcc to specifically unroll a loop
- How to Force Vectorization in C++
Jak widać większość z nich jest na C, ale to sądził, że mogą pracować również w C++. Tu jest mój kodu:
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;
}
użyłem AL podpowiedzi Widać komentowane powyżej, ale nie dostałem żadnej przyspieszenie jako pokazy wyjściowych próbki (przy pierwszym uruchomieniu po Odkomentowano to #pragma GCC ivdep Unroll Vector
:
[email protected]:~/Downloads$ g++ test.cpp -O3 -std=c++0x -funroll-loops -ftree-vectorize -o test
[email protected]:~/Downloads$ ./test
It took me 0.026575 seconds.
[email protected]:~/Downloads$ g++ test.cpp -O3 -std=c++0x -o test
[email protected]:~/Downloads$ ./test
It took me 0.0252697 seconds.
Czy jest jakaś nadzieja Albo flagi optymalizacji O3
właśnie załatwia sprawę Wszelkie sugestie na przyspieszenie tego kodu (funkcja foo
) są mile widziane
Moja wersja g ++:?!
[email protected]:~/Downloads$ g++ --version
g++ (Ubuntu 4.8.1-2ubuntu1~12.04) 4.8.1
Należy zauważyć, że ciało pętli jest przypadkowe. Nie jestem interesujący w przepisywaniu go w innej formie.
EDIT
Odpowiedź mówiąc, że nie ma nic więcej, co można zrobić to również dopuszczalne!
Więc spojrzał na zespół, aby sprawdzić, czy jest już wektoryzowane pod '-O3'? – Mysticial
O cholera, nie, nie. Zamierzam to zrobić, sprawdzając to pytanie: http://stackoverflow.com/questions/1289881/using-gcc-to-produce-readable-assembly Dobry pomysł @Mysticial! – gsamaras
@Mysticial może odpowiedź udzielona przez Davida sprawia, że czytanie zgromadzenia nie jest potrzebne? – gsamaras