C ++ verwendet SSE-Anweisungen zum Vergleichen riesiger Vektoren von Ints

Ich habe eine riesigevector<vector<int>> (18 M × 128). Häufig möchte ich 2 Zeilen dieses Vektors nehmen und sie mit dieser Funktion vergleichen:

    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;
}

Wie Sie sehen, führt die Funktion, die die beiden Zeilenvektoren durchläuft, eine gewisse Subtraktion durch und gibt am Ende ein Maximum zurück. Diese Funktion wird millionenfach verwendet, daher habe ich mich gefragt, ob sie durch SSE-Anweisungen beschleunigt werden kann. Ich benutze Ubuntu 12.04 und gcc.

Natürlich ist es eine Mikrooptimierung, aber es wäre hilfreich, wenn Sie mir helfen könnten, da ich nichts über SSE weiß. Danke im Voraus

Benchmark:

    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;

woher

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.;
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage