представляет из себя изображение. Если координата Y текущего пикселя меньше или равна максимальному значению Y в этом столбце, то значит я закрашиваю пиксель в красный цвет, если нет, то не трогаю пиксель.
По сути выражение должно выглядеть так.
Логика без маски такая:
if(width/i <= maxY_in_collumn)
{
image[i] = int_red;
}
else
{
Image = image;
}
С маской
Image[i] = image[i] ? mask ? currentY ? fillColor;
Там стоят вопросы, потому что я не придумал пока какие знаки туда ставить. Я конечно мог бы просто закрашивать не построкам, а по столбцам.
dataX = image.data() + x;
for(int i = 0; i < y; i++)
{
*dataX = color;
dataX += witdth;
}
Но как оказалось закрашивать изображение по столбцам очень дорого. Гораздо дешевле закрашивать по строчкам.
Провёл тесты о том как будет разница скорость заполнения одномерного массива по столбцам и по строкам.
"0.002529400000" - результат если заполнять по столбцам(то есть i+width)
"0.000290700000" - результат если заполнять по строкам(то есть просто i++)
Размер массива 1000x1000
Ничего не понятно, но очень интересно
А у вас уже есть эти максимумы или вы их ещё должны найти? Самый банальный способ - за один проход найти все максимумы, за второй - закрасить. В обоих случаях можно бежать сквозным способом, перебирая индексы. Номер столбца есть значение текущего индекса по модулю количества столбцов
потому что в одном случае ты линейно бежишь по массиву, во втором прыгаешь через 1000 эелементов. Логично, что второй вариант будет сильно медленнее. А вот что ты там понаписывал про битовую маску я понять не смог вообще.
Да, максимумы будут вычислены. Все это будет происходить на raspberry pi 4, хочется скорости. Это по сути построчное действие над матрицей и вектором(вектор максимальных значений в столбце). Есть матрица двумерная, мы по её строке бежим и и закрашивем пиксели в зависимости от максимального значения в этом столбце. Я просто хочу сделать максимально простой код без if, что бы минимум операций было. Я вроде бы видел инструкцию в arm neon, название не помню, но звучит так: если меньше чем это, то делаем это. Это SSE инструкция которая позволяет делать эту операцию над вектором. Вот теперь надо точно посмотреть что она делает и может её удастся использовать.
Пока на твоем уровне умения программировать я бы не советовал тебе лезть в Neon или SSE. Там потребуется узучить тебе многое, а не просто интринсик заюзать.
Это что же там такого надо знать кроме названия вызова функций? Что я процессор сломать могу? Вот вчера ускорил с помощью SSE функцию преобразования координат в два раза. vmls функция, которaя делает a-(b*c). Формула которую ускорял такая: offsetX - (vectorX[i]*-scalex) Патом ещё round нужно сделать. Тоже с помощью sse сделал
Ну, хозяин-барин. Вперед и с песней. Я только так и не понял нафига ты тогда сюда приходил.
Это просто спортивный интерес или реально упёрся в производительность и приходиться оптимизировать ?
Ну вообще спортивный интерес), да и начальник требует что бы нагрузки на проц было как можно меньше.
Если писать кривой код при работе с большими матрицами и тензорами при работе с картинками и видео, то гарантировано всё будет тормозить даже на последних процах от Интела.
Тебе к сведени. SSE, Neon, АVX - это увеличение нагрузки на процессор. Процессоры быстро превращаются в обогреватели при юзании оного.
А зачем их придумали тогда?
Планету обогревать )
Для того, чтобы считать нужное быстрее.
Обсуждают сегодня