Мне нужно найти самое высокое и самое низкое значение в массиве поплавков. Необязательно, я хочу, чтобы иметь возможность пропускать элементы массива и оценивать только каждую 2-ю, 4-й, 8-й и т.д. элемент:Есть ли более быстрый способ найти максимальное/минимальное значение в массиве, чем в OS X vecLib?
float maxValue = 0.0;
float minValue = 0.0;
int index = 0;
int stepwith = 8;
for(int i = 0; i < pixelCount; i++)
{
float value = data[index];
if(value > maxValue)
maxValue = value;
if(value < minValue)
minValue = value;
index += stepwidth;
if(index >= dataLength)
break;
}
Это, кажется, самый быстрый способ без использования другой магии.
Так что я попробовал другую магию, а именно vIsmax() и vIsmin() функцию из vecLib (включено в OSX»Ускорить рамки) которым, по-видимому использует ускорение процессора уровня векторных операций:
int maxIndex = vIsmax(pixelCount, data);
int minIndex = vIsmin(pixelCount, data);
float maxValue = data[maxIndex];
float minValue = data[minIndex];
Это очень быстро, но не позволяет пропускать значения (функции не предлагают аргумент «шаг»). Это делает его на самом деле медленнее, чем мой первый код, потому что я могу легко пропустить каждое восьмое значение.
Я даже нашел третий путь с BLAS которым реализует подобную функцию:
cblas_isamax(const int __N, const float *__X, const int __incX)
с __incX = походкой перескочить значения, но это не так быстро, на всех, и только находит абсолютные максимумы которым Безразлично Я работаю для меня.
Итак, мой вопрос: может ли кто-нибудь подумать о другом способе ускорить это?
Вы можете написать код SIMD (используя встроенные функции), который получает min и max за один проход. Однако шаг был бы сложным, но если у вас есть определенные значения шага, о которых вы заботитесь, тогда вы можете специализироваться на этих случаях. –
Интересно, я не знал, что смогу это сделать ... Спасибо! Подвела меня к этому вопросу, который кажется хорошей отправной точкой: http://stackoverflow.com/questions/15238978/sse3-intrinsics-how-to-find-the-maximum-of-a-large-array-of- floats – Sebastian