iOS 4 ускоряет Cblas с матрицами 4x4 - PullRequest
6 голосов
/ 16 октября 2010

Я изучал платформу Accelerate, которая стала доступна в iOS 4. В частности, я сделал несколько попыток использовать подпрограммы Cblas в моей библиотеке линейной алгебры в C. Теперь я не могу использовать эти функциичтобы дать мне какой-либо выигрыш в производительности по сравнению с очень простыми процедурами.В частности, случай умножения матрицы 4х4.Где бы я не мог использовать аффинные или однородные свойства матриц, я использовал эту подпрограмму (сокращенно):

float *mat4SetMat4Mult(const float *m0, const float *m1, float *target) {
    target[0] = m0[0] * m1[0] + m0[4] * m1[1] + m0[8] * m1[2] + m0[12] * m1[3];
    target[1] = ...etc...
    ...
    target[15] = m0[3] * m1[12] + m0[7] * m1[13] + m0[11] * m1[14] + m0[15] * m1[15];
    return target;
}

Эквивалентный вызов функции для Cblas:

cblas_sgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
   4, 4, 4, 1.f, m0, 4, m1, 4, 0.f, target, 4);

Сравнивая их, заставляя их проходить через большое количество предварительно вычисленных матриц, заполненных случайными числами (каждая функция каждый раз получает один и тот же вход), подпрограмма Cblas работает примерно в 4 раза медленнее, когда синхронизируется с часами C() function.

Мне это не кажется правильным, и у меня остается ощущение, что я что-то делаю не так.Нужно ли как-то включать устройство NEON и SIMD?Или я не должен надеяться на лучшую производительность с такими маленькими матрицами?

Очень ценится,

Bastiaan

Ответы [ 2 ]

5 голосов
/ 01 ноября 2010

В презентациях Apple WWDC2010 говорится, что Accelerate все равно должен дать ускорение даже при работе с матрицей 3x3, поэтому я бы предположил, что вы увидите небольшое улучшение для 4x4. Но нужно учитывать, что Accelerate & NEON предназначены для значительного ускорения целочисленных операций, но не обязательно операций с плавающей запятой. Вы не упомянули процессор вашего процессора, и похоже, что Accelerate будет использовать либо NEON, либо VFP для операций с плавающей запятой, в зависимости от вашего процессора. Если он использует инструкции NEON для 32-битных операций с плавающей запятой, то он должен работать быстро, но если он использует VFP для 32-битных операций с плавающей запятой или 64-битных двойных операций, то он будет работать очень медленно (поскольку VFP на самом деле не SIMD). Поэтому вам следует убедиться, что вы используете 32-битные операции с плавающей запятой с Accelerate, и убедитесь, что он будет использовать NEON вместо VFP.

И еще одна проблема заключается в том, что даже если он использует NEON, нет гарантии, что ваш компилятор C будет генерировать более быстрый код NEON, чем ваша простая функция C без инструкций NEON, потому что компиляторы C, такие как GCC, часто генерируют ужасный код SIMD, потенциально работает медленнее, чем стандартный код. Вот почему всегда важно проверять скорость сгенерированного кода и, возможно, вручную просматривать сгенерированный код сборки, чтобы увидеть, генерирует ли ваш компилятор неверный код.

4 голосов
/ 04 марта 2011

Библиотеки BLAS и LAPACK предназначены для использования с тем, что я бы назвал «средними и большими матрицами» (от десятков до десятков тысяч на стороне).Они будут давать правильные результаты для меньших матриц, но производительность будет не такой хорошей, как могла бы быть.

Для этого есть несколько причин:

  • Для обеспечения максимальной производительностиМатричные операции 3x3 и 4x4 должны быть встроены, а не в библиотеке;издержки, связанные с выполнением вызова функции, слишком велики, чтобы их можно было преодолеть, когда мало работы.
  • Для достижения максимальной производительности необходим совершенно другой набор интерфейсов.Интерфейс BLAS для умножения матриц принимает переменные для указания размеров и начальных размеров матриц, участвующих в вычислениях, не говоря уже о том, следует ли транспонировать матрицы и макет хранилища.Все эти параметры делают библиотеку мощной и не снижают производительность для больших матриц.Однако к тому времени, как он завершит определение того, что вы выполняете вычисления 4x4, функция, предназначенная для выполнения матричных операций 4x4, и ничего больше уже не завершено.

Что это значит для вас: если бы выЕсли вам нужны выделенные операции с небольшими матрицами, перейдите на bugreport.apple.com и сообщите об ошибке, запрашивающей эту функцию.

...