Оптимизированная неуместная транспозиция матрицы

моя реализация заключается в том, что я использую кривую z-порядка для прохождения записей каждого матричного блока. эта реализация приводит к 3-кратному ускорению, чем наивный подход (см. Мой код ниже).

я хочу добиться лучшего ускорения, просматривая записи каждого блока в порядке строк и используя кривую z-порядка для определения порядка посещения матричных блоков.

как мне это реализовать??

      `int Compact1By1(int x)
{
  x &= 0x55555555;                  // x = -f-e -d-c -b-a -9-8 -7-6 -5-4 -3-2 -1-0
  x = (x ^ (x >>  1)) & 0x33333333; // x = --fe --dc --ba --98 --76 --54 --32 --10
  x = (x ^ (x >>  2)) & 0x0f0f0f0f; // x = ---- fedc ---- ba98 ---- 7654 ---- 3210
  x = (x ^ (x >>  4)) & 0x00ff00ff; // x = ---- ---- fedc ba98 ---- ---- 7654 3210
  x = (x ^ (x >>  8)) & 0x0000ffff; // x = ---- ---- ---- ---- fedc ba98 7654 3210

  return x;

}

`

      `void optimized(int *src, int *dst, int SIZE)
{
   int blocksize = 64;
   int x=0;
   int y=0;
    int tmp = 0;

    for (int i = 0; i < SIZE; ++i) {

        for ( int j = 0; j < SIZE; j += blocksize) {
                tmp = i*SIZE + j;

                for(int z = tmp; z < tmp + blocksize ; ++z){

                    x=Compact1By1(z >> 0);
                    y=Compact1By1(z >> 1);
                    dst[(y * SIZE) + x] = src[(x * SIZE) + y];

                }

        }
    }
}
`

0 ответов

Другие вопросы по тегам