Является ли строка галоидной индексации главной, основной колонкой или смесью?

Я хотел бы проверить мое понимание того, как работает индексирование в Halide.

Во многих уроках я вижу галогенидные буферы, индексированные как [x,y,c], а именно [колонка, строка, канал]. Функция, которая запускает JIT, согласуется с этим:

realize(input.width(), input.height(), input.channels())

Как хранятся основные данные?

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

Если это действительно правильно, как оно распространяется на четыре измерения? Является ли правило, что индексирование является основным по строкам, за исключением того, что вы всегда меняете местами первые два индекса?

0 ответов

По умолчанию Halide хранит крайнее левое внутреннее измерение. Итак, если у вас есть 2D-изображение

Func f;
f(x, y) = ...;

Затем макет данных сохраняется в основном порядке строк, поскольку yэто самое внешнее измерение. Это можно изменить в расписании, сделав его основным столбцом, используя:

f.reorder_storage(y, x);

Для 3D-изображений, у которых есть f(x, y, c), цветовые каналы являются крайними, что делает изображение плоским. Так же работает итерация:x по умолчанию - это самый внутренний цикл.

При работе с входными изображениями вам придется устанавливать шаги вручную. Например, если вы хотите ввести чересстрочное изображение, иf были входными данными, тогда вы должны были бы написать:

f.dim(0).set_stride(3)  // x -- RGB, 4 for RGBA
 .dim(2).set_stride(1); // c -- stride for channels is 1.
                        // stride for y will be 3 * width

Дополнительные сведения о структуре памяти см. По адресу:https://halide-lang.org/tutorials/tutorial_lesson_16_rgb_generate.html

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