Я хочу убедиться, что я понял концепцию векторизованного кода, которая упоминается во многих лекциях / заметках / видеороликах по машинному обучению.
Я прочитал об этом и обнаружил, что у процессоров и графических процессоров естьнабор инструкций под названием SIMD;одна команда несколько данных.
Это работает, например, путем перемещения двух переменных в два специальных 64/128-битных регистра, а затем добавления всех битов сразу.
Я также прочитал это с большинствомсовременные компиляторы, такие как GCC, например, если вы включаете оптимизацию с флагом -Ofast
, который является
-Ofast - Игнорировать строгое соответствие стандартам.-Ofast включает все оптимизации -O3.Он также позволяет выполнять оптимизации, которые не подходят для всех стандартных программ.Он включает -ffast-math и специфичные для Fortran -fno-protect-parens и -fstack-arrays.
Затем -Ofast
должен автоматически векторизовать все циклы, написанные на C / C ++, когдавозможно SIMD инструкции.
Я проверил это на моем собственном коде и смог значительно ускорить набор данных MNIST с 45 минут до 5 минут.
Я также знаю, что numpy написан на C и обернут PyObjects.Я прочитал большую часть их кода, но это сложно.
Мой вопрос: правильное ли мое понимание выше, и действительно ли Numpy делает то же самое, или они используют explicit pragmas
или другие специальные instruction/register
названия для их векторизации?