Я работаю над приложением, написанным на C ++, которое должно обрабатывать некоторые данные, хранящиеся в непрерывном пространстве памяти, которые интерпретируются как трехмерный массив.
Для эффективной обработки данных мне нужно изменить порядок данных в памяти.
Итак, вот пример:
Исходные данные находятся в памяти, и у меня есть доступ к данным через указатель данных (uint16_t*
), который интерпретируется как 3D-массив и имеет следующие размеры:
xSize=4, ySize=4, zSize=3
В памяти данные расположены следующим образом: (d x, y, z )
д_ 0,0,0 | д_ 1,0,0 | д_ 2,0,0 | д_ 3,0,0 | д_ 0,1,0 | д_ 1,1,0 | д_ 2,1,0 | д_ 3,1,0 | .... | д_ 3,0,2 | д_ 3,1,2 | д_ 3,2,2 | д_ 3,3,2 |
Теперь я хотел бы получить данные в порядке z, y, x:
д_ 0,0,0 | д_ 0,0,1 | д_ 0,0,2 | д_ 0,1,0 | д_ 0,1,1 | д_ 0,1,2 | .... | д_ 2,3,2 | д_ 3,3,0 | д_ 3,3,1 | д_ 3,3,2 |
Я сделал реализацию со следующими циклами:
for (uint32_t z = 0; z < zSize; z++) {
for (uint32_t y = 0; y < ySize; y++) {
for (uint32_t x = 0; x < xSize; x++) {
uint32_t readPos = z * xSize * ySize + y * xSize + x;
uint32_t outPos = y * xSize * zSize + x * zSize + z;
*(dataOutPtr + outPos) = *(dataInPtr + readPos);
}
}
}
Кто-нибудь знает, как ускорить этот алгоритм?
Можно ли выполнять некоторые части в параллельном выполнении или кто-нибудь знает другое решение для переупорядочения трехмерных данных?