Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2013, 08:06   #1
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию Оптимизация RGB->YUV

Вот такая простая задачка как перевод картинки из RGB в YUV формат.
Начальный вариант был в "лоб" и на картинке 1280 на 1024 работал в среднем 26мс. После развертки циклов и перехода к целочисленным операциям вариант стал работать гораздо быстрее - около 5мс, что уже вполне не плохо.
Хотелось бы еще быстрее с помощью SSE
Может для кого-то это будет быстро, сможет помочь или натолкнуть на статью где все прозрачно, с ASM работал только в универе около 4 лет назад.
Код:
void RGBtoYUV::CovertRGBtoYUV(unsigned char* rgbData) {
	int R, G, B;
	int U, V;

	unsigned char* rPtr0 = rgbData;
	unsigned char* rPtr1 = rgbData+resX*3;

	unsigned char* wPtr0 = yData;
	unsigned char* wPtr1 = yData+resX;

	unsigned char* uPtr = uData;
	unsigned char* vPtr = vData;

	for (int j = 0; j < resY; j += 2) {
		for (int i = 0; i < resX; i += 2) {
			R = *rPtr0++;
			G = *rPtr0++;
			B = *rPtr0++;

			*wPtr0++ = ((  66 * R + 129 * G +  25 * B + 128) >> 8) + 16;
			U		 = (  -38 * R -  74 * G + 112 * B + 128);
			V		 = (  112 * R -  94 * G -  18 * B + 128);

			R = *rPtr0++;
			G = *rPtr0++;
			B = *rPtr0++;

			*wPtr0++ = ((  66 * R + 129 * G +  25 * B + 128) >> 8) + 16;
			U		+= (  -38 * R -  74 * G + 112 * B + 128);
			V		+= (  112 * R -  94 * G -  18 * B + 128);

			R = *rPtr1++;
			G = *rPtr1++;
			B = *rPtr1++;

			*wPtr1++ = ((  66 * R + 129 * G +  25 * B + 128) >> 8) + 16;
			U		+= (  -38 * R -  74 * G + 112 * B + 128);
			V		+= (  112 * R -  94 * G -  18 * B + 128);

			R = *rPtr1++;
			G = *rPtr1++;
			B = *rPtr1++;

			*wPtr1++ = ((  66 * R + 129 * G +  25 * B + 128) >> 8) + 16;
			U		+= (  -38 * R -  74 * G + 112 * B + 128);
			V		+= (  112 * R -  94 * G -  18 * B + 128);

			U >>= 8;
			V >>= 8;
			U += 512;
			V += 512;

			*uPtr++ = U >> 2;
			*vPtr++ = V >> 2;
		}
		rPtr0 += resX*3;
		rPtr1 += resX*3;

		wPtr0 += resX;
		wPtr1 += resX;
	}
}
Я понимаю что цель оптимизации эти и подобные строки:
Код:
			*wPtr0++ = ((  66 * R + 129 * G +  25 * B + 128) >> 8) + 16;
			U		 = (  -38 * R -  74 * G + 112 * B + 128);
			V		 = (  112 * R -  94 * G -  18 * B + 128);
где явно выделяются два вектора, которые можно поместить в xmm регистры. это {66, 129, 25, 128} и {R, G, B, 1}, например для первой строки. Но как сделать не знаю.
Kukurudza вне форума Ответить с цитированием
Старый 29.03.2013, 11:47   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

для таких вещей (переход из одного цветового пространства в другое) стоит видеокарту использовать. матрицу перобразования задали и пусть видеокарта считает, для размеров 1280х1024 выигрыш возможно будет и не сильно большой (если будет вообще), но с ростом размера видеокарта будет доминировать.
можно и на SSE сделать, думаю пригодятся PUNPCKHBW/PUNPCKLBW, PMULLW, PHADDSW.
f.hump вне форума Ответить с цитированием
Старый 13.04.2013, 12:50   #3
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

а как сделать следующее:
Код:
int a[4] = {1,2,3,4};
int b[4] = {5,6,7,8};
a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3];
умножение векторов так: PMULLW
а вот как сложить еще? вроде есть такая команда?
или как сложить все числа внутри xmm регистра?
Kukurudza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
RGB в CMYK и CMYK в RGB могут конвертироваться без потери качества? hon Мультимедиа в Delphi 5 19.08.2012 14:41
rgb(***,***,***) Fisherman86 Общие вопросы Delphi 3 31.03.2012 11:40
Палитра RGB Discovery Microsoft Office Excel 12 11.06.2011 12:04
RGB Flow Kepler Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 09.03.2011 00:58
RGB в Цвет. HELP! Altera Мультимедиа в Delphi 1 27.02.2008 07:58