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() |