align="justify"> Прив'язка двовимірного масиву (в глобальній пам'яті він все одно зберігається як лінійний, і звернення до нього йде по одній координаті):
cudaBindTexture2D (size_t shift, texref tex, amp; src, amp; channelDesc, int width, int height, int pitch);
- shift - зміщення при прив'язці до масиву (до одного масиву можна прив'язати кілька текстур);
- tex - оголошена текстура;
- src - масив в глобальній пам'яті, до якого прив'язується текстура;
- channelDesc - опис каналу;
- width - ширина двовимірного масиву;
- height - висота двовимірного масиву;
- pitch - зміщення кожного рядка.
Після закінчення роботи з текстурою її треба відв'язати :( texref tex);
Всі вищенаведені функції викликаються з хоста. На пристрої використовується функція, яка дістає значення з текстури:
tex1Dfetch (texRef tex, int index);
- tex - оголошена текстура;
- index - індекс виймаємого значення в лінійному масиві.
В якості вхідного демонстраційного прикладу в Лабораторної роботі №4 створений проект LR4_1, в якому одновимірний масив тестових даних завантажується в текстурную пам'ять, і ядро ??GPU обчислює твір елемента масиву на його індекс, заповнюючи вихідний одновимірний масив.
2.3 CudaArray текстурная пам'ять
В якості основи для такого типу пам'яті виступає спеціальний контейнер cudaArray, який є чорним ящиком для додатків. Використання cudaArray обгрунтовано тоді, коли ми хочемо створити двох або тривимірну структуру, або нас важливі перетворення, які графічний процесор може здійснювати апаратно з вихідними даними:
§ Нормалізація координат (переклад [W, H]= gt; [0,1]).
§ Перетворення координат:
- Clamp - координата обрізається по межі;
- Wrap - координата загортається.
§ Фільтрація (при зверненні по float координаті):
- Point - повертається найближчим задане значення;
- Linear - виробляється білінійна інтерполяція.
Для використання cudaArray текстурної пам'яті потрібно оголосити змінну-покажчик на cudaArray: * a;
Потім необхідно виділити пам'ять під дані на відеокарті:
cudaMallocArray (struct cudaArray ** arrayPtr, const struct cudaChannelFormatDesc * channelDesc, size_t width, size_t height);
- arrayPtr - покажчик на cudaArray;
- channelDesc - опис каналу;
- width - ширина масиву;
- height - висота масиву.
Потім скопіювати у виділену пам'ять дані:
cudaMemcpyToArray (struct cudaArray * dst, size_t wOffset, size_t hOffset, const void * src, size_t count, enum cudaMemcpyKind kind);
- arrayPtr - покажчик на cudaArray;
- wOffset - зміщення по горизонталі при прив'язці до масиву;
- hOffset - зміщення по вертикалі при прив'язці до масиву;
- src - масив в пам'яті хоста, до який копіюється;
- count - розмір даних в байтах;
- kind - напрямок копіювання.
Після того як дані скопійовані, можна здійснювати прив'язку cudaArray масиву до текстури:
cudaBindTextureToArray (const struct textureReference * tex, const struct cudaArray * array, const struct cudaChannelFormatDesc * desc);
- tex - оголошена текстура;
- array - масив в cudaArray, до якого прив'язується текстура;
- channelDesc - опис каналу.
На пристрої використовуються функції, які дістають значення з текстури:
tex1D (texRef tex, float x);
- tex - оголошена текстура;
- x - індекс виймаємого значення в лінійному масиві.
tex2D (texRef tex, float x, float y);
- tex - оголошена текстура;
- x, y - індекси виймаємого значення у двомірному масиві.
tex3D (texRef tex, float x, float y, float z);
- tex - оголошена текстура;
- x, y, z - індекси виймаємого значення в тривимірному масиві.
Після використання необхідно відв'язати текстуру точно так само як...