Если вы уверены, что у вас нет возможности для алгоритмической оптимизации , вам придется полагаться на оптимизации очень низкого уровня, чтобы ускорить ваш код.Они очень зависят от платформы / компилятора, поэтому ваш пробег может варьироваться.
Вероятно, что в какой-то момент узкое место операции вытягивает значения arr
из памяти.Поэтому убедитесь, что ваши данные размещены в линейном кеше.То есть &arr[i][j+1] - &arr[i][j] == sizeof(double)
.
Вы также можете попытаться развернуть свой внутренний цикл, если ваш компилятор этого еще не сделал.Ваш код:
for (j = 0; j < 10000; j++)
{
perElemSimilarity += arr[i][j];
}
Например, станет:
for (j = 0; j < 10000; j+=10)
{
perElemSimilarity += arr[i][j+0];
perElemSimilarity += arr[i][j+1];
perElemSimilarity += arr[i][j+2];
perElemSimilarity += arr[i][j+3];
perElemSimilarity += arr[i][j+4];
perElemSimilarity += arr[i][j+5];
perElemSimilarity += arr[i][j+6];
perElemSimilarity += arr[i][j+7];
perElemSimilarity += arr[i][j+8];
perElemSimilarity += arr[i][j+9];
}
Это основные идеи, которые сложно сказать больше, не зная вашей платформы, компилятора, глядя на сгенерированный код сборки.
Возможно, вы захотите взглянуть на эту презентацию , чтобы получить более полные примеры возможностей оптимизации.
Если вам нужна еще большая производительность, вы можете взглянуть на SIMDвстроенные средства для вашей платформы, например, попытка использовать, скажем, OpenMP, для распределения вычислений по нескольким потокам.
Еще одним шагом будет попытка использовать OpenMP, что-то из следующего (непроверенного):
#pragma omp parallel for private(perElemSimilarity) reduction(+:sum)
for (i = 0; i < 10000; i++)
{
perElemSimilarity = 0;
/* INSERT INNER LOOP HERE */
perElemSimilarity /= pCluster->size;
sum += perElemSimilarity;
}
Но учтите, что даже если вы доведите эту часть кода до 0% (что невозможно) от вашего времени выполнения, ваш алгоритм GA все равно будет работать несколько часов.Ваше узкое место в производительности теперь в другом месте, поскольку эта часть кода занимает «только» 22% вашего времени выполнения.