Názor k článku Použití instrukcí SSE a AVX pro zrychlení bitových operací od Praktik - Pro lepší vektorizaci ručně rozvinutého kódu by mělo...

  • Článek je starý, nové názory již nelze přidávat.
  • 11. 12. 2022 17:18

    Praktik

    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.