Когда использовать устройство, а когда использовать спецификатор постоянного адресного пространства на языке затенения металлов? - PullRequest
0 голосов
/ 29 октября 2019

Я знаю, что адресное пространство устройства используется при индексации буфера, а постоянное адресное пространство используется, когда многие вызовы функции будут обращаться к одной и той же части буфера. Но мне все еще не очень ясно. Спасибо!

1 Ответ

1 голос
/ 30 октября 2019

На основании этого Спецификация языка металлического шейдинга

Адресное пространство устройства

Имя адресного пространства устройства относится к объектам буферной памяти, выделенным из пула памяти устройствакоторые читаются и пишутся. Объект буферной памяти может быть объявлен как указатель или ссылка на скалярную, векторную или пользовательскую структуру. В приложении вызовы Metal API выделяют память для объекта буфера, который определяет фактический размер буферной памяти. Вот некоторые примеры:

// An array of a float vector with four components.

device float4 *color;
struct Foo {
float a[3];
int b[2];
}
// An array of Foo elements.
device Foo *my_info;

Поскольку вы всегда выделяете объекты текстуры из адресного пространства устройства, вам не требуется атрибут адреса устройства для типов текстуры.

постоянное адресное пространство

Имя постоянного адресного пространства относится к объектам буферной памяти, выделенным из пула памяти устройства, но доступным только для чтения. Переменные в области действия программы должны быть объявлены в постоянном адресном пространстве и инициализированы во время оператора объявления. Выражение initializer (s) должно быть выражением основной константы. Переменные в области действия программы имеют то же время жизни, что и программа, и их значения сохраняются между вызовами любых вычислительных или графических функций в программе.

constant float samples[] = { 1.0f, 2.0f, 3.0f, 4.0f };

Указатели или ссылки на постоянное адресное пространство допускаются в качестве аргументов функций. Запись в переменные, объявленные в постоянном адресном пространстве, является ошибкой времени компиляции. Объявление такой переменной без инициализации также является ошибкой во время компиляции. Чтобы решить, какое адресное пространство (устройство или константа) использует буфер только для чтения, передаваемый в графическую функцию или функцию ядра, посмотрите, как осуществляется доступ к буферу внутри графической функции или функции ядра. Постоянное адресное пространство оптимизировано для нескольких экземпляров, выполняющих графические функции или функции ядра, обращающиеся к одному и тому же месту в буфере. Некоторыми примерами этого шаблона доступа являются доступ к свету или свойствам материала для освещения / затенения, матрица матричной матрицы, используемой для создания оболочки, вес фильтра, доступный из массива фильтра для свертки. Если несколько выполняющихся экземпляров графической функции или функции ядра обращаются к буферу с помощью индекса, такого как идентификатор вершины, координата фрагмента или позиция потока в сетке, буфер должен быть выделен в адресном пространстве устройства.

...