Pro lepší vektorizaci ručně rozvinutého kódu by mělo stačit zbavení se závislosti i2 na i, třeba nezávislým výpočtem ve for
:
#pragma GCC ivdep for(int i = 0, i2 = 0; i<4*SAMPLES; i+=4, i2+=2) { int16_t raw0 = inbuf[i+0]; int16_t raw1 = inbuf[i+1]; int16_t raw2 = inbuf[i+2]; int16_t raw3 = inbuf[i+3]; raw0 = (raw0 & 0xEFFF) | ((raw0 & 0xE000)>>1); raw1 = (raw1 & 0xEFFF) | ((raw1 & 0xE000)>>1); raw2 = (raw2 & 0xEFFF) | ((raw2 & 0xE000)>>1); raw3 = (raw3 & 0xEFFF) | ((raw3 & 0xE000)>>1); outbuf1[i2 ] = (float)raw0; outbuf1[i2 + 1] = (float)raw1; outbuf2[i2 ] = (float)raw2; outbuf2[i2 + 1] = (float)raw3; }
Případně zpracovává-li se sekvenčně velké množství dat, která se nevejdou do L2 cache, tak by měl rychlejšímu běhu pomoci gcc přepínač -fprefetch-loop-arrays
.