Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие_CUDA.docx
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

Особенности текстурной памяти.

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

  • объем данных больше, чем допускает разделяемая память,

  • доступ к памяти носит хаотичный характер,

  • данные используются разными потоками.

Работа с текстурами в CUDA идет при помощи так называемых текстурных ссылок (texture reference). Такая ссылка задает некоторую область в глобальной памяти, из которой будет производиться чтение. Перед чтением необходимо "привязать" текстурную ссылку к соответствующей области выделенной памяти.

Текстурная ссылка фактически является объектом, обладающим набором свойств (атрибутов), такими как размерность, размер, тип хранимых данных и т.п. Некоторые из этих свойств можно изменять, другие же являются неизменяемыми и задаются всего один раз.

Текстурная ссылка задается при помощи следующей конструкции:

Texture <Type, Dim, ReadMode> texRef;

Параметр Type обозначает тип данных, возвращаемых при чтении из текстуры. В качестве этого параметра можно использовать базовые целочисленные типы, а также их 1/2/3/4-мерные векторы.

Параметр Dim задает размерность текстуры и принимает значения от 1 до 3 включительно.

Параметр ReadMode определяет, нужно ли производить так называемую нормализацию прочитанных из текстуры значений в тех случаях, когда параметр Type является целочисленным типом (или целочисленным вектором). Нормализацией целочисленных значений называется их отображение в floating-point-значения из отрезка [-1,1] для знаковых типов и [0,1] для беззнаковых. Фактически нормализация значений – это просто деление на максимально возможное значение данного типа (после преобразования во float).

В качестве значения параметра ReadMode выступает одна из следующих констант:

cudaReadModeNormalizedFloat – для случая, когда необходимо произвести нормализацию;

cudaReadModeElementType – когда никакой нормализации проводить не нужно.

В качестве памяти для текстуры можно использовать любую область: как линейной памяти, так и блоклинейной, называемой CUDA-массив (CUDA array). Отличия линейной текстурной памяти от блоклинейной представлены в табл.3.8.

Таблица 3. 8.

Типы текстурной памяти в CUDA

Линейная память

Блоклинейная память

Можно использовать обычную глобальную память

Ограничения:

  • только для одномерных массивов;

  • нет фильтрации

  • доступ по целочисленным координатам;

  • обращение по адресу вне допустимого диапазона возвращает ноль.

Доступ: tex1Dfetch(tex, int)

Позволяет организовывать данные в

1D/ 2D/3D массивы данных вида:

  • 1/2/4 компонентные векторы;

  • 8/16/32 bit signed/unsigned integers

  • 32 bit float;

  • 16 bit float (driver API)

Доступ: по семейству функций

tex1D()

tex2D()

tex3D()