быстрое сравнение массивов в iOS - PullRequest
4 голосов
/ 19 февраля 2012

Мне нужно переместить небольшой двумерный массив значений вокруг намного большего двумерного массива значений и установить любые значения большего массива, которые больше соответствующих значений в меньшем массиве, равными значениям меньшего массива.Подумайте о компоновке изображений, но с использованием двух 2D-массивов с плавающей точкой.Мне нужно сделать это в сотню раз как можно быстрее.Просто интересно, есть ли какой-то способ оптимизации с использованием NEON Assembly, инфраструктуры Accelerate или какого-либо другого метода, о котором я не слышал.Что-нибудь будет намного быстрее, чем двойной вложенный цикл for для сравнения и замены значений?Например, возможно ли было бы быстрее сохранить значения в виде одномерного массива вместо двумерного массива?Или быстрее получить доступ к значениям по строкам, а не по каждому столбцу?Просто пытаюсь выжать лишнюю скорость, какую только смогу, но не знаю, как.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2012

Я не знаю ни одной функции в платформе Accelerate, которая будет делать то, что вы хотите.Определенно, вы можете использовать NEON для его ускорения, не переходя непосредственно к языку ассемблера, используя встроенный vmin_f32 для обработки двух пар с плавающей запятой одновременно или используя vminq_f32 для обработки четырех пар одновременно.

Эти ссылки могут помочь вам начать использовать встроенные функции, но у меня нет для вас лучшего совета:

Как использовать умножение и накопление встроенных функций в ARM Cortex-a8?
Информационный центр ARM - NEON Intrinsics
ARM NEON Оптимизация.Пример

Я нашел их с помощью googling neon intrinsics tutorial.

Также в пакет инструментов разработчика входит некоторая документация по архитектуре ARM:

Xcode 4.2: /Developer/Library/PrivateFrameworks/DTISAReferenceGuide.framework/Versions/A/Resources/ARMISA.pdf
Xcode 4.3: /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks/DTISAReferenceGuide.framework/Versions/A/Resources/ARMISA.pdf

0 голосов
/ 19 февраля 2012

Если вам нужно сравнить одномерные массивы C с structs, вы можете попробовать memcmp(), чтобы увидеть, является ли он более эффективным, чем цикл for.Если вы можете позволить себе какой-то вид хэша массива, вы можете значительно повысить производительность в случаях, когда массивы различаются.Например, если у вас есть массив чисел с плавающей точкой, вы можете использовать их сумму в качестве хэша.Если хэши массивов различаются, вам не нужно сравнивать массивы вообще.С другой стороны, если вы ожидаете, что массивы фактически равны в большинстве случаев, вычисление хеша только замедлит ход событий.

Может помочь и творческий подход с вычислением хеша.В случае двумерных массивов хэш может быть полиномом хэшей массива 1D или даже struct с метаданными, такими как размеры массивов, хэш хэшей массива 1D и т. Д.примерно в 2 раза быстрее, чем прямой однопоточный цикл for при сравнении больших массивов с плавающей точкой в ​​худшем случае (когда массивы равны).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...