Я хочу выровнять память матрицы 5x5, представленной в виде одномерного массива.
Исходный массив выглядит следующим образом:
let mut a = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25];
или
[ 1 2 3 4 5 ]
[ 6 7 8 9 10 ]
a = [ 11 12 13 14 15 ]
[ 16 17 18 19 20 ]
[ 21 22 23 24 25 ]
с длиной 25 элементов.
после изменения размера памяти до границ, выровненных по памяти (степень 2), массив будет выглядеть следующим образом:
a = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ];
или
[ 1 2 3 4 5 6 7 8 ]
[ 9 10 11 12 13 14 15 16 ]
[ 17 18 19 20 21 22 23 24 ]
[ 25 0 0 0 0 0 0 0 ]
a = [ 0 0 0 0 0 0 0 0 ]
[ 0 0 0 0 0 0 0 0 ]
[ 0 0 0 0 0 0 0 0 ]
[ 0 0 0 0 0 0 0 0 ]
длина элемента теперь составляет 64 элемента.
, поэтому он станет матрицей 8x8
цель состоит в следующем представлении:
a = [1 2 3 4 5 0 0 0 6 7 8 9 10 0 0 0 11 12 13 14 15 0 0 0 16 17 18 19 20 0 0 0 21 22 23 24 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ];
или
[ 1 2 3 4 5 0 0 0 ]
[ 6 7 8 9 10 0 0 0 ]
[ 11 12 13 14 15 0 0 0 ]
[ 16 17 18 19 20 0 0 0 ]
[ 21 22 23 24 25 0 0 0 ]
[ 0 0 0 0 0 0 0 0 ]
[ 0 0 0 0 0 0 0 0 ]
[ 0 0 0 0 0 0 0 0 ]
Фон должен иметь a
память, выровненную по степени двойки, поэтому вычисления могут частично выполняться параллельно (для OpenCL float4
или для доступных векторных размеров.). Я также не хочу использовать новый массив, чтобы просто вставить старые элементы в правильные позиции, чтобы сохранить низкое потребление памяти.
Сначала я думал об обмене элементами в диапазоне, где должен быть ноль с элементами в конце массива, сохраняя указатель на элементы и моделируя очередь, но элементы будут складываться до конца, и я не придумал рабочего решения.
Мой язык выбора - ржавчина. Есть ли какой-нибудь умный алгоритм для достижения желаемого результата?