Когда Цельсий выдвинул свою шкалу, он принял за 0 градусов температуру кипения, а за 100 температуру замерзания. После его смерти шкала была перевернута.
Операции с матрицами хорошо векторизуются, следовательно, мы можем использовать SIMD-расширения процессоров, а именно – SSE (MMX не позволяет работать с плавающей запятой). Но для использования SSE инструкций нам необходимо явно указывать их, поэтому код основной расчетной функции придется переделать.
Все арифметические SSE инструкции оперируют над векторами, длина которых зависит от типа данных: для float n=4, для double n=2. Будем оперировать типом float, поскольку для него прирост производительности заметнее.
Будем использовать ленточную схему распараллеливания, а вернее – просто оригинальный алгоритм умножения. Отличие в данном случае состоит в том, что мы просто уменьшим количество шагов при вычислении каждого элемента во внутреннем цикле в 4 раза – по числу элементов, параллельно обрабатываемых в SSE-инструкции.
На каждом шаге теперь мы будем брать по 4 элемента строки матрицы, по 4 элемента вектора и перемножать их одной командой SSE, а затем – складывать одной командой сразу 4 пары элементов. Все, что останется сделать в конце цикла – это сложить 4 частичных суммы явно. Для этого в SSE3 есть специальная команда «горизонтального» сложения, а вот в SSE2, к сожалению, ее нет, поэтому в приведенном ниже примере приходится явно перегружать вектор из 4 компонент в массив, а потом – складывать элементы массива.