Я программирую, для кроссплатформенного C, библиотеку, которая делает различные вещи для изображений с веб-камеры. Все операции выполняются для каждого пикселя и имеют высокую степень распараллеливания - например, применение битовых масок, умножение значений цвета на константы и т. Д. Поэтому я думаю, что могу повысить производительность, используя встроенные функции SSE / SSE2.
Однако у меня проблема с форматом данных. Моя библиотека веб-камеры дает мне кадры веб-камеры в виде указателя (void *) на буфер, содержащий 24- или 32-битные байтовые пиксели в формате ABGR или BGR. Я приводил их к типу char *, чтобы ptr ++ и т.д. вели себя правильно. Однако все операции SSE / SSE2 ожидают либо четыре целых числа, либо четыре числа с плавающей запятой в типах данных __m128 или __m64. Если я сделаю это (при условии, что я прочитал значения цвета из буфера в символы r, g и b):
float pixel [] = {(float) r, (float) g, {float) b, 0.0f};
затем загрузить другой массив с плавающей точкой, полный констант
константы с плавающей точкой [] = {0,299, 0,587, 0,114, 0,0f};
приведите оба указателя с плавающей точкой к __m128 и используйте встроенную функцию __mm_mul_ps для выполнения r * 0.299, g * 0.587 и т. Д.
и т. д. нет общего прироста производительности, потому что все перемешивание занимает столько времени!
Есть ли у кого-нибудь предложения о том, как быстро и эффективно загрузить эти значения байтовых пикселей в регистры SSE, чтобы я действительно получил выигрыш в производительности, работая с ними как таковой?