Portál AbcLinuxu, 18. dubna 2024 06:58


Dotaz: Packed 10bit raw

8.12.2019 21:31 Jirka | skóre: 25
Packed 10bit raw
Přečteno: 866×
Odpovědět | Admin
Zdravím všechny,
Mám 8bitové raw obrázky přímo z 1MP senzoru, můžu je jednoduše načíst do pole uint8_t array[1024000] a všechno je v pořádku.
A pak mám např. 10bitový (packed)raw a teď co s tím, jak to efektivně rozporcovat do 16bitových proměnných opět v poli o předem známé velikosti, kde jedna proměnná bude 1 pixel.
Ideální by bylo pole 10bit proměnných, které bych jednou for() otočkou nakopíroval do pole 16bit proměnných, ale problém je v tom, že 10bit proměnná nejspíš neexistuje a různí lidé na fórech to řeší rúzným dost složitým "bit fiddlingem", nejspíš s dopadem na rychlost.
Neřešil to někdo? Díky. :-)
Dokud to funguje, nešťourej se v tom!...

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

8.12.2019 22:04 R
Rozbalit Rozbalit vše Re: Packed 10bit raw
Odpovědět | | Sbalit | Link | Blokovat | Admin
Bitove operacie su rychle, takze s vykonom problem nebude. Nacitas do pola bajtov a prejdes to jednym for()om, akurat k tomu pridas nejake bitove posuny, operacie (and) a pocitanie bitov, vysledok do pola uint16_t.
9.12.2019 09:10 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
Začátek načtení do uint8 jasnej, jde mi spíš o ten další postup.
Teď mě napadlo číst z těch uint8 proměnných bit po bitu, ukládat do uint16 a jak jich for() napočítá deset, začne ukládat do další. To skoro svádí na vstupu místo uint8 použít proměnné co největší šířky.
Dokud to funguje, nešťourej se v tom!...
9.12.2019 13:09 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Ako sa to uklada? Jednodlive farby? Rovno za sebou vzdy 10bitov vzdy?

Ak sa s tym nechce babrat, tak to uloz ako RAW a skonvertuj nastrojom externym.

Ak chces co najrychlejsie, tak optimalizuj na cast, kde sa to stale periodicky opakuje, tj.
8=2*2*2
10=2*5

NSN(8,10)=2*2*2*5=40
Cize srtuktura sa opakuje vzdy po 40 bitov.

Sak nepouzivaj co najvecsi, ale najblizsi nasobok osmicky, ale najlepsie je typ int pre danu platformu. Ak vykon. Zas ak pamet.
9.12.2019 13:12 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
A s konverziu si urob sprv na papier, az potom do pc!!! Ako algoritmus a resp. nasledne ekvivaletny kod.
9.12.2019 13:29 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
Je černobílý, takže co pixel, to jen hodnota jasu mezi 0 a 1023, raw je 10ti bitový, hodnoty pixelů jsou nalepené těsně za sebou v jednom dlouhém streamu... a v tom je ten problém.
Zkouším tu něco jako posuvný registr, kterej na jedný straně načítá z pole do bufferu proměnné po jedné, pak sebere hodnotu MSB a uloží do LSB výstupní uint16 proměnné.
Pak << 1 ve vstupním bufferu i výstupní proměnné a načtení dalšího msb ze vstupu a uložení do dalšího lsb na výstupu atd...
Jak se uloží deset bitů, jde se na další výstupní proměnnou a jak se zpracuje celý buffer, načte se do něj další vstupní proměnná.
Je to piplačka, otázka, jestli je to ten správnej způsob.
Dokud to funguje, nešťourej se v tom!...
9.12.2019 15:12 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Uz som ti pisal, ze najlepsie je spracovavat cez 40B bufre. Ak neveris, zrataj si to alebo porovnaj rychlost spracovanie. Ako ta sa tvojim, ale ked chces najrychlejsie tak mojim
Moja rezia pre jednu farbu:
1) nacitanie int z RAW pamete
2) vyber tych 10 bitov ktore potrebujem
3) ofset (zarovnanie na zaciatok al. koniec)
4) ulozenie na 2B do pamete
5) podmienka, ci nie je koniec
A takto to zadefinujes pre kazdy hodnoty farby (10b) v 40B blok.

Pozn.: Pracuj s int, lebo procesor nemusi vediet robit nejake operiacie priamo z iba castami Bajtu (napr. nasobit/delit), takze by si to musel konvertovat z/na int.

Mas pocit ze Tvoje riesenie je jednoduchsie pre jednu farbu?
9.12.2019 15:44 Peter Golis | skóre: 64 | blog: Bežné záležitosti | Bratislava
Rozbalit Rozbalit vše Re: Packed 10bit raw
Koľko bitový má byť ten int? Momentálne prevláda 64bit architektúra.
9.12.2019 16:27 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
Už to hledám, jak udělat uint40, stejným způsobem by mohl jít udělat uint10, kterej by to všecko zjednodušil na jednu for() smyčku. :-)
Dokud to funguje, nešťourej se v tom!...
9.12.2019 19:22 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Podla normy ma minimalne 2 bajty. Ale v praxy rozne. Velkost zistis nasledovne. Ale kedze tvoj rozsah je max 2B, tak ti to podstatne je jedno. Kedze cez posun a vyber bytov sa da napisat univerzalne. Ak chces mozes osetrit pre istotu nasledovne:
#if sizeof(int) < 2
 #error "Data type must by higger as 2Bajty."
#end
9.12.2019 21:19 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Binarne, ake su vahy 10-bajtu? take? 512:256 : 128:64:32:16 : 8:4:2:1
9.12.2019 17:58 R
Rozbalit Rozbalit vše Re: Packed 10bit raw
Ano, tak nejako. Nepouzivaj na vstupe viac ako bajt - neusetris nic a vzniknu zbytocne problemy (endian, adresacia).

Nejaky priklad z mojho kodu - cita n bitov (najviac 8) z pola data dlzky len a pozicie bitpos - pozor, vsetko sa modifikuje:
/* get n bits of data */
u8 get_bits(u8 **data, u16 *len, u8 *bitpos, u8 n) {
        u8 bits = 0;
        u8 byte;

        for (int i = 0; i < n; i++) {
                if (*len == 0) {
                        printf("%s DATA UNDERFLOW\n", bin_n(bits, i));
                        return 0;
                }
                byte = *data[0];
                bits <<= 1;
                bits |= ((byte << *bitpos) & 0x80) >> 7;
                (*bitpos)++;
                if (*bitpos > 7) {
                        (*data)++;
                        (*len)--;
                        *bitpos = 0;
                }
        }
        return bits;
}
9.12.2019 18:30 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
Nějaký krátký.
Před měsícem jsem byl programátorskej analfabet, mám napsanou asi půlku a už je to tak 3x delší. :-D
Až to dodělám a otestuju, fláknu to sem na odborný zkritizování. :-)
Dokud to funguje, nešťourej se v tom!...
10.12.2019 13:05 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Co je bin_n()???
10.12.2019 13:23 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Ako mam pouzit Tvoj kod (testujem rychlost). Skusam a hadzalo segment fail alebo potom furt error:

Moj format je:
/*
 * sizeof(input) = minimal 40 - spracuje 5B
 * sizeof(output) = minimal 8 - zapise 4B
 * output must be zero
 */
void u10to16_block(uint8_t *input, uint16_t *output)
{
}
10.12.2019 13:58 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Ok. Uz netreba, uz som to opravil. uz to funguje.
10.12.2019 14:43 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Nepouzivaj na vstupe viac ako bajt - neusetris nic a vzniknu zbytocne problemy (endian, adresacia).
To nie je prevda. Useetris 38% resp. 50%. Zas, tam je tazsia ta/cez endianitu. Zapis uz je lahsi.
10.12.2019 14:45 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
Přečteš celej buffer buď normálně, nebo pozpátku podle endianity...
Dokud to funguje, nešťourej se v tom!...
10.12.2019 20:17 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Ak spracujes podla jedneho Bajtu.

Pri posunoch a vyberu bitov je jedno aka endianita. Ak sa jedna len o surovy vyber konkretnych bajtov. Prakticiky namerane, prehodenie bitov prakticky nehraje rolu (aspon na AMD64).

Hm, tie % su bez optimalizacii. S nimi je rozdiel, markantnost - nech posudi kto potrebuje.
DaBler avatar 9.12.2019 22:04 DaBler | skóre: 17 | blog: dabler | Brno
Rozbalit Rozbalit vše Re: Packed 10bit raw
Odpovědět | | Sbalit | Link | Blokovat | Admin
které bych jednou for() otočkou nakopíroval do pole 16bit proměnných
A proč to tak něudělat? Co je těžkého na tom spočítat adresu a offset v poli bajtů?
#include <stdint.h>
#include <stdio.h>
#include <inttypes.h>

uint8_t packed[8] = { 0x01, 0xFC, 0x2F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F };
uint16_t unpacked[6];

int main()
{
	int i;

	for (i = 0; i < 6; ++i) {
		unpacked[i] = *(uint16_t *)&packed[i*10/8] >> i*10%8 & 0x3FF;
		printf("%" PRIu16 "\n", unpacked[i]);
	}

	return 0;
}
9.12.2019 22:13 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
No pro toho, co teď dělá svůj druhej program v životě, celkem těžký je, resp. budu muset pokoumat, jak se to vůbec používá. :-)
Dokud to funguje, nešťourej se v tom!...
9.12.2019 22:33 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak tady je ten výtvor. Ale ať to počítám popředu, pozpátku, ukládám popředu, pozpátku, furt z toho leze stejnej paskvil, jako když zadám imagemagicku convert -depth 10... Tohle vypadá na nějakej stopbit ze senzoru. Budu muset k OV9281 sehnat nějakej přesnější datasheet.
Tohle projede intel i5 za vteřinu. Teď to budu muset lehce optimalizovat, aby to raspberry stihlo rychlejc, než za 1/120s... :-D


uint64_t vstup[160000] = {0}; //vstupní buffer na 10bitový raw
uint64_t (*pvstup) = vstup; 
uint16_t vystup[1024000] = {0}; //výstupní buffer na 16bit raw
uint16_t (*pvystup) = vystup;


int main(void)
 {
 FILE *file;
 file = fopen("/ram/input.raw", "r");
 fread(vstup, 1280000, 1, file);      //načteno

 long ocounter=0;                     //počítadlo otoček for(), jeden průchod = jedna výstupní proměnná. Použito k výstupní kalkulaci
 int icounter=0;                      //počítadlo posunů v 64bit vstupním bufferu. 
 int bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7, bit8, bit9;     // jednotlivé bity, které se budou ukládat do výst. proměnné
 uint64_t obuffer = 0;                //buffer pro jednu vstupní proměnnou, odsud se čte a po každé for () otočce se udělá posun doprava o 10bitů a po vyprázdnění se načte další proměnná
 long ocountbuffer = 159999;          //adresa proměnné vstupního bufferu, odkud se právě čte
   
 obuffer = pvstup[159999];            //prvotní načtení
   
 for(ocounter = 1023999; ocounter > 0; ocounter--)                                      //smyčka pro načtení bitů do výstupní proměnné
  {
   bit0 = obuffer & 1;icounter++;                                                       //jasně že i tohle by šlo udělat smyčkou :-) 
      if(icounter == 64){ocountbuffer--;obuffer = pvstup[ocountbuffer];icounter = 0;}   //test, jestli nedošlo k vyčerpání bufferu obuffer, pokud jo, načte se další vlevo od zpracovaného a vyresetuje počítadlo
   bit1 = obuffer>>1 & 1;icounter++;
      if(icounter == 64){ocountbuffer--;obuffer = pvstup[ocountbuffer];icounter = 0;}
   bit2 = obuffer>>2 & 1;icounter++;
      if(icounter == 64){ocountbuffer--;obuffer = pvstup[ocountbuffer];icounter = 0;}
   bit3 = obuffer>>3 & 1;icounter++;
      if(icounter == 64){ocountbuffer--;obuffer = pvstup[ocountbuffer];icounter = 0;}
   bit4 = obuffer>>4 & 1;icounter++;
      if(icounter == 64){ocountbuffer--;obuffer = pvstup[ocountbuffer];icounter = 0;}
   bit5 = obuffer>>5 & 1;icounter++;
      if(icounter == 64){ocountbuffer--;obuffer = pvstup[ocountbuffer];icounter = 0;}
   bit6 = obuffer>>6 & 1;icounter++;
      if(icounter == 64){ocountbuffer--;obuffer = pvstup[ocountbuffer];icounter = 0;}
   bit7 = obuffer>>7 & 1;icounter++;
      if(icounter == 64){ocountbuffer--;obuffer = pvstup[ocountbuffer];icounter = 0;}
   bit8 = obuffer>>8 & 1;icounter++;
      if(icounter == 64){ocountbuffer--;obuffer = pvstup[ocountbuffer];icounter = 0;}
   bit9 = obuffer>>9 & 1;icounter++;
      if(icounter == 64){ocountbuffer--;obuffer = pvstup[ocountbuffer];icounter = 0;}

   pvystup[ocounter] = bit0+(2*bit1)+(4*bit2)+(8*bit3)+(16*bit4)+(32*bit5)+(64*bit6)+(128*bit7)+(256*bit8)+(512*bit9);  //prozatím kalkulace, tohle půjde dořešit a zrychlit bitovým posunem :-) 
   obuffer = obuffer>>10;                                                                                               // bitový posun
   printf("\rocounter %10d icounter %2d read %6d", ocounter, icounter, ocountbuffer);                                   //debug
   }
   
 file = fopen("/ram/output.raw", "wb");                                                                                 //zápis výsledku
 fwrite(vystup,2048000 , 1, file);
   
   
   
  //printf("stav%X,ocountbuffer %d, ocounter %d \n",vystup, ocountbuffer, icounter);
  
    
  
   
 }

Dokud to funguje, nešťourej se v tom!...
9.12.2019 23:17 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nie je lepsie zostat pri 8bit? Sak pri ciernobielych by to az nemalo vadit.
10.12.2019 07:36 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
V tomhle případě je, nebo lépe udělat 16bit buffer a do něj nasčítat 256 expozic a dalších 256 se zakrytým objektivem odečíst. Pak je výstup na 1/4 senzorek hodně kvalitní v 16ti bitech.
Jde mi o zvládnutí těchhle packed dat, větší senzory už nic jiného nepoužívají a jedou v 12-14bitech. Tenhle senzorek je jen trenažér. :-)
Dokud to funguje, nešťourej se v tom!...
9.12.2019 23:22 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Odpovědět | | Sbalit | Link | Blokovat | Admin
Daj na ukazku RAW jednu snimku.
10.12.2019 07:32 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
Dokud to funguje, nešťourej se v tom!...
10.12.2019 08:43 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
A ještě jeden debug, jak tam ty jedničky a nuly skutečně lítaj. Vpravo od šikmých čar je pravděpodobně MSB, je vidět, že v každým řádku 2 bity chyběj, jakoby byl výstup jen osmibitový.
Velikost souboru při přepnutí senzoru z 8bit na 10bit ale vzroste odpovídajícím způsobem.
Dokud to funguje, nešťourej se v tom!...
10.12.2019 10:41 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Sak otestuj hranicne stavy - uplne svetlo, uplnu tmu a nieco medzi a kukni na vystup.
10.12.2019 12:31 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
Vidíš, to mě nenapadlo :-)
Ve tmě má ten senzor určitou nenulovou úroveň jasu, podle který bezpečně identifikuju LSB. Otestuju večer.
Dokud to funguje, nešťourej se v tom!...
10.12.2019 19:15 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
Tak všecko je jinak, senzor furt odesílá osmibitově, jen každej pátej paket pošle (opět osmibitově) složeninu která se musí rozsekat na díly po dvou bitech a každej přilepit na konec předešlých paketů. Celý to má navíc pravděpodobně nějakej offset nebo zpřeházený bity, takže černej snímek má hodnotu 00010000. To se už dořeší, pak sem hodím finální řešení. Díky všem. :-)
Dokud to funguje, nešťourej se v tom!...
Řešení 1× (Jirka (tazatel))
10.12.2019 22:06 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
A je to. Výsledek teď hned. :-)
uint8_t vstup[1280000] = {0}; 
uint8_t (*pvstup) = vstup;
uint16_t vystup[1024000] = {0};
uint16_t (*pvystup) = vystup;

int main(void)
 {
 FILE *file;
 file = fopen("/ram/input.raw", "r");
 fread(vstup, 1280000, 1, file);

 long i = 0;
 long o = 0;
 
 while(i<1023998) 
   {
   pvystup[i] = (((pvstup[o]-16)<<2) + (pvstup[o+5]&11));        // nějak mi lítaj hlavou myšlenky na starý dobrý cmosy 4000 :-D 
   pvystup[i+1] = (((pvstup[o+1]-16)<<2) + ((pvstup[o+5]>>2)&11));
   pvystup[i+2] = (((pvstup[o+2]-16)<<2) + ((pvstup[o+5]>>4)&11));
   pvystup[i+3] = (((pvstup[o+3]-16)<<2) + ((pvstup[o+5]>>6)&11));
   i = i + 4;
   o = o + 5;
   }
 
 file = fopen("/ram/output.raw", "wb");
 fwrite(vystup,2048000 , 1, file);
 }

Kdyžtak mi to ještě odborně zkritizujte, co by se dalo udělat líp. :-)
Dokud to funguje, nešťourej se v tom!...
11.12.2019 15:21 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
1) nemas hlavicky 2) fopen a fclose (tj. neuzatvaras subory) 3) 1. fopen daj tiez wb (i ked Linuxu je to jedno, ale na Windows nie) 4) pis dlhym long int - lepsie pre citanie 5) main ma navratnu hodnotu - ju nemas
11.12.2019 18:46 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
hlavičky mám, jen mi je tohle fórum nedovoluje vložit.
fclose - beru na vědomí :-)
uint32_t vs unsigned long moc písmenek :-D Ale jo, když to vadí. :-)
Ty pointery na pole - zkoušel jsem to metodou pokus omyl tak dlouho, až ta jejich [adresa] fungovala. Mám v plánu to prostudovat. :-)
návratový hodnoty - asi by podle pravidel bejt měly, ale aspoň ten počítač občas "drží hubu", když se ho nikdo na nic neptá, to manželka neumí. :-D
Dokud to funguje, nešťourej se v tom!...
11.12.2019 15:23 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
uint8_t (*pvstup) = vstup;
nespravne. Priradenie musis robit pocas behu programu, kedze pole vstup pri kazdom behu programu, je umiestnene na inej adrese (neveris, skus printf("vstup %p\n", vstup);
10.12.2019 10:43 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Ak uplne v pravo je najvyssi bit, tak pre nas to je fajn. AMD64 prirodzena architektura.
10.12.2019 14:28 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak mame tu niekolko implementacii, tak som zmeral rychlosti (na AMD A4-5000 APU):
od DaBler
real	0m0,036s
user	0m0,032s
sys	0m0,005s
od R
real	0m0,035s
user	0m0,026s
sys	0m0,008s
moje (s __builtin_bswap16, podla, bez bodu 5)
real	0m0,022s
user	0m0,013s
sys	0m0,009s
moje (podla, bez bodu 5)
real	0m0,018s
user	0m0,011s
sys	0m0,007s
Sposob merania: Nacitania subory cez jeden fread a spracovanie po 5B vstupnych blokov. Vystup po spracovani sa zahadzuje. Funkcia na prevod je poouzita ako static inline. Prekladane iba s parametrom -Wall.
10.12.2019 14:46 R
Rozbalit Rozbalit vše Re: Packed 10bit raw
Taketo meranie je na hovno. Pouzi viac dat alebo to spustaj viackrat, nech to bezi aspon niekolko sekund. Kompiluj s -O2.

P.S. Moj kod sluzi na spracovanie datoveho formatu, ktory pouziva bitove retazce premenlivej dlzky. Konverzia napisana natvrdo na 10b -> 16b moze byt rychlejsia.
10.12.2019 15:22 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Je to priemer.

Vstup je jeho vstup.

Zatial nateraz mam dost. Neskor skusim aj tie optimalizacie.

Zas na druhej strane, kamera ma konstatne data. Takze tam sa da napisat na mieru. Kedze charakter prostredia je rovnaky.

Ja so tom to pisal natrdo 10b-> 16b. Moj kod je menej prenosilnejsi.

Jasne, mozno este v ASM by to bolo rychlejsie. U seba pouzivam memcpy(). Ak by to bolo silnejsie platformove, mozno by to este trocha bolo rychlejsie.
10.12.2019 17:38 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak, vstup som 10x zvacsil a skompiloval s -O2. Priemer z 1000 vykonavani. Predtym bol este 5 krat spusteny.

Priemerne hodnoty
osoba       real      user      sys
R          0.066s   0.051ms   0.015ms
DaBler     0.027s   0.005ms   0.022ms
ja [1]     0.024s   0.005ms   0.019ms
ja         0.024s   0.000ms   0.024ms

[1] - (s __builtin_bswap16, podla, bez bodu 5) 
10.12.2019 19:05 R
Rozbalit Rozbalit vše Re: Packed 10bit raw
Nejako tu nevidim nikde ten tvoj kod.
10.12.2019 20:05 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Zatial som nedaval kod, len popis.
10.12.2019 20:03 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Odpovědět | | Sbalit | Link | Blokovat | Admin
Aj moznost -O3.
osoba       real      user      sys
R          0.030s   0.013ms   0.017ms
ja [1]     0.027s   0.004ms   0.023ms
DaBler     0.026s   0.004ms   0.022ms
ja         0.025s   0.005ms   0.020ms

[1] - (s __builtin_bswap16, podla, bez bodu 5)
11.12.2019 13:40 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Odpovědět | | Sbalit | Link | Blokovat | Admin
Toto je najpresnejsie merania a posledne !!! Preklad bol s -O3, nakolko vysledne vykonavanie programu je najrychlejsie. 1005 spusteni, kde 5 merani spusteni nezahrnieva. Vstup bol jeden snimok.
osoba        real      user      sys
ja [1]      0.004s   0.000ms   0.004ms
ja [1][2]   0.004s   0.004ms   0.000ms
DaBler [3]  0.005s   0.000ms   0.004ms
R [3]       0.005s   0.000ms   0.004ms
Jirka       0.008s   0.004ms   0.004ms
[1] - podla, bez bodu 5 [2] - s __builtin_bswap16

[3] - podla dalsieho merania medzi nimi je riesenie R trosku pomalsie
11.12.2019 15:04 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
Už jsem to trochu zoptimalizoval, vyházej plusy, dej místo nich | (OR hradlo) a zkus to znova. :-)
Dokud to funguje, nešťourej se v tom!...
11.12.2019 15:17 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Pastni kod.
11.12.2019 15:25 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
uint8_t vstup[1280000] = {0}; 
uint8_t (*pvstup) = vstup;
uint16_t vystup[1024000] = {0};
uint16_t (*pvystup) = vystup;

int main(void)
 {
 FILE *file;
 file = fopen("/ram/input.raw", "r");
 fread(vstup, 1280000, 1, file);

 long i = 0;
 long o = 0;
 
 while(i<1023998) 
   {
   pvystup[i] = (((pvstup[o])<<2) | (pvstup[o+5]&11));        
   pvystup[i+1] = (((pvstup[o+1])<<2) | ((pvstup[o+5]>>2)&11));
   pvystup[i+2] = (((pvstup[o+2])<<2) | ((pvstup[o+5]>>4)&11));
   pvystup[i+3] = (((pvstup[o+3])<<2) | ((pvstup[o+5]>>6)&11));
   i = i + 4;
   o = o + 5;
   }
 
 file = fopen("/ram/output.raw", "wb");
 fwrite(vystup,2048000 , 1, file);
 }
Skoro to samý. :-)
Dokud to funguje, nešťourej se v tom!...
11.12.2019 15:50 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Tvoj novy kod (priemer):
real: 0.009s
user: 0.005ms
sys: 0.005ms
11.12.2019 16:07 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
Takže v rámci nějakýho rozptylu měření to samý. Čteš a zapisuješ na ramdisk?
Dokud to funguje, nešťourej se v tom!...
11.12.2019 17:19 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Subor citam z disku. Ale kedze je to v cache, tak to je ako by to bolo v RAMKE. V programoch sa cely subor nacitava naraz, tj. zisti sa akttualna velkost a alokuje v pamete. (mimo Tvojho zadania). Pred testom davam echo SUBOR > /dev/null. Aby bol ten subor v cache. RAMky na take male programy pre testovanie dost. Aby to bolo v cache. Vysledok nikam neukladam. Tj. necham ho iba vyratat. V tvojom pripade je len v RAM.

Log vystupu zapisujem do Ramdisk. A nasledne po teste programu ho ukladam.

Pocas testu sa nic nerobi a frekfrencie jadra su vsetky na maximalne.

P.S.: Ako keby niekto velmi stukal, tak da sa to dat do ram filesystem. Ale rozdiely nie su velke a su logicke. Preco je jeden lepsi ako druhy.
11.12.2019 17:48 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
V poho, spíš mě zarážely ty hodně podobný výsledky. Otázka, co z toho zabere čtení/zápis a co samotný výpočet (který by mimochodem proběhl i s prázdným bufferem, neb je v mém případě vyplněn nulama). I tak je ten čas nejspíš v poho, buffer nečtu z disku ale dostanu ho ze senzoru a musím ho zpracovat rychleji, než přijde po 1/120s další frame. :-)
Dokud to funguje, nešťourej se v tom!...
11.12.2019 19:45 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Tak si to porovnajme. Neratam nacitanie 1/2 bajtu z pamete, ulozenie.
  meno instrukcii
   Moj 3 
DaBler 6
     R 6
    Ty 4
Problem, ze ti nespracujes po blokov ale Bajtov. Chap, ze operacny system rozdelu na pamet na stranky (tusim 4kB), tak zmena stranku vyvola prerusenie programu a musi OS prehodit stranky. A Ty tam striedas stranky. Ak spracuvas po 6B blokov, tak v mensich rozsahoch skace.

Tvoje aktualne tebou napisane zadanie nestaci, lebo je vecsie ako 1/120=0,0083.
11.12.2019 15:18 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Nechces skript na testovanie ;)
11.12.2019 15:21 debian+
Rozbalit Rozbalit vše Re: Packed 10bit raw
Po kliknuti na tvoj nick v mojom prispevku mas link na kod, kt. som pouzil.
11.12.2019 15:28 Jirka | skóre: 25
Rozbalit Rozbalit vše Re: Packed 10bit raw
Výše. Jasný, vyházel jsem matematický operace + a - , ty dělám až pak (tady nejsou) kvůli kompenzaci odchylek v jednotlivých bajtech, co odesílá senzor a dělá tím slabý svislý pruhy. To by samozřejmě zdržovalo. :-)
Dokud to funguje, nešťourej se v tom!...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.