ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
9 июля
300844
Sntos (20.01.2012 18:32, просмотров: 527)
Метод HackersDelight работает. Сравнение производительности прямого и оптимизированного метода вращения битовой матрицы. http://caxapa.ru/299233.html
Оптимизированный метод практически в 6 раз быстрее прямого. (STM32L152 работает на частоте 32 МГц, клетка на осциллограмме 1 мс, компилятор IAR). void test_transpose(void) { unsigned char a[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // diagonal matrix unsigned char b[8],i,k; unsigned int j; for(i = 0;i < 8; i++) b[i] = 0; for(j = 0; j < 50000; j++) { led_on(1); for(i = 0; i < 200; i++) { optimized_transpose_8x8(a,b); for(k = 0;k < 8; k++) b[k] = 0; } led_on(0); for(i = 0; i< 200; i++) { direct_transpose(a,b); for(k = 0;k < 8; k++) b[k] = 0; } } } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- void optimized_transpose_8x8(unsigned char *src, unsigned char *dst) { register unsigned int x,y,t; x = (*src<<24) | ((*(src+1))<<16) | ((*(src+2))<<8) | (*(src+3)); y = (*(src+4)<<24) | ((*(src+5))<<16) | ((*(src+6))<<8) | (*(src+7)); t = (x^(x >> 7)) & 0x00aa00aa; x = x ^ t ^ (t << 7); t = (y^(y >> 7)) & 0x00aa00aa; y = y ^ t ^ (t << 7); t = (x^(x >> 14)) & 0x0000cccc; x = x ^ t ^ (t << 14); t = (y^(y >> 14)) & 0x0000cccc; y = y ^ t ^ (t << 14); t = (x & 0xf0f0f0f0) | ((y >> 4) & 0x0f0f0f0f); y = ((x << 4)& 0xf0f0f0f0) | (y & 0x0f0f0f0f); *dst = t>>24; (*(dst+1)) = t>>16; (*(dst+2)) = t>>8; (*(dst+3) = t); *(dst+4) = y>>24;(*(dst+5)) = y>>16; (*(dst+6)) = y>>8; (*(dst+7) = y); } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- void direct_transpose(unsigned char *ta, unsigned char *tb) { unsigned char mask; unsigned char *pdst; register unsigned int i = 0; do{ mask = 0x01; pdst = tb; do{ if(*ta & mask)*pdst = *pdst | (1 << i); pdst++; mask <<= 1; }while(mask); ta++; i++; }while(i<8); } //---------------------------------------------------------------------------- //----------------------------------------------------------------------------
image