Názor k článku Použití instrukcí SSE a AVX pro zrychlení bitových operací od Josef Pavlik - skvely clanek. Diky za nej. Alespon je videt,...

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

    Josef Pavlik

    skvely clanek. Diky za nej. Alespon je videt, jak konkretne dokazou tyto instrukce zoptimalizovat program a kolik casu se tim usetri.
    K tomu prevodu int16 -> float, ja bych na to vyuzil look up table. Mas tady pouze 12 bitu plus znamenkovy bit. To je 8k float hodnot. Kdyz k tomu pridame i ten bit, co je nevyznamny (a v tabulce ho budeme ignorovat), budeme mit 16k float hodnot. To neni tak moc. Jestli mas chut zkusit, jak by to vypadalo casove, pripadne jestli by se dal i tento program zoptimalizovat pomoci SSE, napis potom, jak ten pokus dopadl.
    Nezkousel jsem to prelozit, doufam, ze tam nemam nejaky preklep

    float lut[0x4000];
    void prepare_lut()
    {
      for (int i=0; i<0x4000; i++)
      {
        int16_t nr=(int16_t)(((i & 0x2000)?0xf000:0)|(i & 0x0fff));
        lut[i]=(float)nr;
      }
    }
    
    void convert()
    {
      float *op1=outbuf1;
      float *op2=outbuf2;
      int16_t *ip=inbuf;
      while (ip<inbuf+4*SAMPLES)
      {
        *op1++=lut[*ip++ & 0x3fff];
        *op1++=lut[*ip++ & 0x3fff];
        *op2++=lut[*ip++ & 0x3fff];
        *op2++=lut[*ip++ & 0x3fff];
      }
    }