Первое, что бросается в глаза, это то, что вы делаете деление на одно и то же число во внутренних циклах.
Не делайте этого. Деление медленное.
Вместо этого вы должны умножить на обратную величину root
вместо того, чтобы делить ее на несколько раз:
inv_root = 1. / sqrt(covmatrix.array[(i * rows) + i]);
for(j = 0; j <= i; j++){ // Move down
corrmatrix.array[ j * rows + i ] *= inv_root;
}
k = i * rows;
for(j = i; j < rows; j++){ // Move across
corrmatrix.array[ k + j ] *= inv_root;
}
Хотя эта оптимизация может показаться очевидной для компилятора, она не может бытьпозволил сделать эту оптимизацию из-за строгости с плавающей точкой.Вы можете попытаться ослабить настройки с плавающей точкой с помощью -ffast-math
(в GCC) или чего-то подобного.