C ++ używa instrukcji SSE do porównywania ogromnych wektorów intów
Mam ogromnyvector<vector<int>>
(18M x 128). Często chcę wziąć 2 wiersze tego wektora i porównać je za pomocą tej funkcji:
int getDiff(int indx1, int indx2) {
int result = 0;
int pplus, pminus, tmp;
for (int k = 0; k < 128; k += 2) {
pplus = nodeL[indx2][k] - nodeL[indx1][k];
pminus = nodeL[indx1][k + 1] - nodeL[indx2][k + 1];
tmp = max(pplus, pminus);
if (tmp > result) {
result = tmp;
}
}
return result;
}
Jak widzisz, funkcja, pętle przechodzące przez dwa wektory wierszy, robi pewne odejmowanie, a na końcu zwraca maksimum. Ta funkcja będzie używana milion razy, więc zastanawiałem się, czy można ją przyspieszyć za pomocą instrukcji SSE. Używam Ubuntu 12.04 i gcc.
Oczywiście jest to mikrooptymalizacja, ale byłoby pomocne, gdybyś mógł udzielić pomocy, ponieważ nic nie wiem o SSE. Z góry dziękuję
Reper:
int nofTestCases = 10000000;
vector<int> nodeIds(nofTestCases);
vector<int> goalNodeIds(nofTestCases);
vector<int> results(nofTestCases);
for (int l = 0; l < nofTestCases; l++) {
nodeIds[l] = randomNodeID(18000000);
goalNodeIds[l] = randomNodeID(18000000);
}
double time, result;
time = timestamp();
for (int l = 0; l < nofTestCases; l++) {
results[l] = getDiff2(nodeIds[l], goalNodeIds[l]);
}
result = timestamp() - time;
cout << result / nofTestCases << "s" << endl;
time = timestamp();
for (int l = 0; l < nofTestCases; l++) {
results[l] = getDiff(nodeIds[l], goalNodeIds[l]);
}
result = timestamp() - time;
cout << result / nofTestCases << "s" << endl;
gdzie
int randomNodeID(int n) {
return (int) (rand() / (double) (RAND_MAX + 1.0) * n);
}
/** Returns a timestamp ('now') in seconds (incl. a fractional part). */
inline double timestamp() {
struct timeval tp;
gettimeofday(&tp, NULL);
return double(tp.tv_sec) + tp.tv_usec / 1000000.;
}