logo
Работа с текстурной памятью

2.1 Текстурная память

Текстурная память располагается в DRAM графического процессора, но в отличие от глобальной памяти имеет кэш, ускоряющий доступ к данным.

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

- объем данных не влезает в shared память;

- паттерн доступа хаотичный;

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

Для использования текстурной памяти необходимо задать объявление текстуры как глобальную переменную:

texture < type, dim, tex_type> g_TexRef;

§ type - тип хранимых переменных;

§ dim - размерность текстуры (1, 2, 3);

§ tex_type - тип возвращаемых значений:

- cudaReadModeNormalizedFloat;

- cudaReadModeElementType.

Кроме того, для более полного использования возможностей текстурной памяти можно задать описание канала:

struct cudaChannelFormatDesc {int x, y, z, w;

enum cudaChannelFormatKind f;};

Задает формат возвращаемого значения;

§ int x, y, z, w; - число [0,32] проекция исходного значения по битам

§ cudaChannelFormatKind - тип возвращаемого значения:

- cudaChannelFormatKindSigned - знаковые;

- intocudaChannelFormatKindUnsigned - беззнаковые ;

- intocudaChannelFormatKindFloat - float.

В CUDA существуют два типа текстур линейная и cudaArray:

Линейная

cudaArray

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

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

· нет фильтрации;

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

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

Доступ: 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()