Оптимизированная неуместная транспозиция матрицы
моя реализация заключается в том, что я использую кривую 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];
}
}
}
}
`