C ++ использует инструкции SSE для сравнения огромных векторов целых чисел
У меня огромныйvector
(18М х 128). Часто я хочу взять 2 строки этого вектора и сравнить их с помощью этой функции:
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;
}
Как видите, функция loop по двум векторам строк выполняет некоторое вычитание и в конце возвращает максимум. Эта функция будет использоваться миллион раз, поэтому мне было интересно, можно ли ее ускорить с помощью инструкций SSE. Я использую Ubuntu 12.04 и gcc.
Конечно, это микрооптимизация, но было бы полезно, если бы вы могли оказать некоторую помощь, так как я ничего не знаю о SSE. заранее спасибо
Ориентир:
int nofTestCases = 10000000;
vector nodeIds(nofTestCases);
vector goalNodeIds(nofTestCases);
vector 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;