Понимание векторизации петли numpy - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу убедиться, что я понял концепцию векторизованного кода, которая упоминается во многих лекциях / заметках / видеороликах по машинному обучению.

Я прочитал об этом и обнаружил, что у процессоров и графических процессоров естьнабор инструкций под названием 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 названия для их векторизации?

1 Ответ

0 голосов
/ 20 декабря 2018

numpy ничего подобного не делает.

Термин векторизация в контексте numpy означает, что вы выполняете numpy-работу над своим массивом напрямую, а не делаете цикл самостоятельно.Обычно он передается в то, что называется «универсальными функциями» или, для краткости, «ufunc».Эти функции являются функциями C, которые будут обрабатывать в C в C цикл, предназначенный для операции, которая предназначена.

Но обычно она не может выполнять векторизацию ISA.Причина в том, что эти функции универсальны для всех типов массивов, плотных или представлений на этих плотных массивах.Таким образом, из-за используемого шаблона вы не можете ожидать векторизации.

Если вы хотите ISA векторизованные вызовы numpy, вы можете использовать numba, который JIT может JIT (и, следовательно, действительно ISA векторизацию).Есть другой проект, который будет использовать одну из библиотек Intel, но я больше не могу его найти.

...