Оптимизированная библиотека BLAS - очень сложный код, и вы вряд ли добьетесь большего успеха, если вы не являетесь экспертом в программировании asm и не разбираетесь в производительности кэш-памяти вашего ЦП и готовы потратить много времени на тестирование различных подходов,Если вы хотите увидеть, как это делается, вы можете скачать и посмотреть исходный код GOTO BLAS (реализован в asm, да).
Я не уверен, как провести существенную оптимизацию вашего кода.Я подозреваю, что уже при N = 100 O (N ^ 2) матрично-векторного произведения будет доминировать во время выполнения, а второй и третий этапы вашего алгоритма довольно незначительны.Поэтому попытка объединить все три шага не выглядит такой полезной.
Я полагаю, что одна незначительная вещь, которую вы можете сделать, если только вы не делаете это, состоит в том, что на третьем шаге умножьте на обратную суммувместо деления на сумму;деление намного дороже, чем умножение.Например,
double my_sum = sum(my_vector);
double tmp = 1 / my_sum;
for (i=...) {
my_vector[i] *= tmp;
}