Member 14198125 Ответов: 1

Использование манипуляций с битами снижает затраты на кэширование


I have a raw12 file(4096 * 3072 ) where RGGB(odd rows RGRG..And even GBGB...) Pixels are stored ,12 bit for each .I have to  use only 5 bit MSB data from each 12 bit data , I have to take 64 bit at a time for cache optimization and use bit manipulation to get 5 MSB bits for each 12 bit pixel,I am not getting , How should I achieve this ? 
 This is code I wrote and working properly but rather than taking 8 bit at a time(buffer is 8bit pointer) I have to take 64 bits .  In buffer I have pointed complete file. *This code is to make a histogram.

Taking LITTLE ENDIAN into consideration

code is in C .


Что я уже пробовал:

for(int i = 0; i < length; i += 3){
       if (i % (3 * 2 * num_cols / 2) < num_cols * (3) / 2) {       /* ODD ROW */
          hist[0][buffer[i] >> 3]++;                                /* CH[0] */
          hist[1][buffer[i+1] & 0x0F << 1 |                         /* CH[1] */
                   buffer[i+2] >> 7]++;
        } else {                                                    /* EVEN ROW*/
          hist[2][buffer[i] >> 3]++;                                /* CH[2] */
          hist[3][buffer[i+1] & 0x0F << 1 |                         /* CH[3] */
                buffer[i+2] >> 7]++ ;
        }
    }

Gerry Schmitz

Серьезно?

если (i % (3 * 2 * число_столбцов / 2) &ЛТ; число_столбцов * (3) / 2) { /* нечетные строки */

Остальная часть "вашего кода" тоже пахнет.

Stefan_Lang

А Джерри мог бы быть и больше ... многословный, он действительно имеет смысл: вы вкладываете много вычислительных шагов в каждое выражение. Это очень затрудняет понимание того, что вы пытаетесь сделать, и это огромный источник ошибок, как ясно видно из условия if, которое процитировал Джерри: вы сравниваете модуль с целым числом - несмотря ни на что, это никогда не бывает хорошей идеей и обычно указывает на ошибку. Это на том же уровне, что и сравнение знаковых и беззнаковых значений, градусы в диапазоне от -180 до 180 делают значение градуса между 0 и 360, или даже дюймы к миллиметрам, Градусы к радианам.

Точно так же выражения для извлечения 12-битных значений из вашего буфера делают много вещей одновременно, и между правилами приоритета операторов, порядком следования и использованием побитовых и логических операторов эти выражения представляют собой полный беспорядок: почти невозможно сказать, что они вычисляют. Вы действительно должны разбить свой код на простые выражения, а затем использовать отладчик, чтобы убедиться, что на каждом шаге ваши промежуточные значения соответствуют ожидаемым.

1 Ответов

Рейтинг:
1

Rick York

Я бы попытался сначала сделать вещи проще и функциональнее, а затем заняться скоростью. Скорость ничего не значит, когда код не работает в первую очередь. Попробуйте что-нибудь вроде этого :

const int width = 4096;
 typedef union
 {
     UCHAR byte;
     struct nibble
     {
         UCHAR first : 4;
         UCHAR second : 4;
     } nibs;
 } bytenib;

 bytenib byte2;
 UCHAR byte1;
 UCHAR byte3;
 USHORT pixel1;
 USHORT pixel2;
 const int width = 4096;

 bool oddrow = row % 2;

 int i = 0;
 while( i < width )
 {
     byte1 = image[row][ i ];
     byte2.byte = image[row][ i + 1];
     byte3 = image[row][ i ];

     pixel1 = byte1 << 4;
     pixel1 |= byte2.nibs.second;
     pixel2 = byte3;
     pixel2 |= ( byte2.nibs.first << 8 );

     i += 3;
 }
Это частичный код для получения двух двенадцатибитных пикселей из трех байтов. Он не принимает во внимание нечетный/четный аспект вещей. Он также показывает очень простой способ определить, является ли строка нечетной или четной.

Ключевым моментом здесь является объединение байта и двух битовых полей, которые составляют по одному кусочку (полбайта) или четыре бита. Это очень простой способ разделить байт пополам.


Stefan_Lang

"Скорость ничего не значит, когда код не работает в первую очередь"
Лучший совет, который можно дать на эту тему! Даже если бы ваше решение закончилось на этом этапе, я бы его поддержал.

Rick York

Спасибо. Люди иногда ошибаются в своих приоритетах, не так ли?