Существует ли обходной путь для негибкого использования ссылок на текстуры в CUDA


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

texture<unsigned char, 2, cudaReadModeElementType> g_tex_a;
texture<unsigned char, 2, cudaReadModeElementType> g_tex_b;

__global__ void gpu_kernel_1()
{
    // long complicated kernel
    foo = tex2D(g_tex_a, x,y);
}

__global__ void gpu_kernel_2()
{
    // long complicated kernel
    bar = tex2D(g_tex_a, x,y);
}

main()
{
    gpu_kernel_1<<<grid, block>>>();
    gpu_kernel_2<<<grid, block>>>();
}

Нельзя ли каким-то образом передать ядру текстуру, которую оно должно считывать с помощью tex2D, например g_tex_a или g_tex_b? Похоже, что компилятор должен знать ссылку на текстуру во время компиляции. Я хотите иметь возможность повторно использовать код gpu_kernel_1 и gpu_kernel_2 для работы с различными текстурами.

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

Есть ли какое-либо другое решение? Спасибо.

2 4

2 ответа:

Перед использованием ссылки на текстуру ее необходимо отобразить в память, например, с помощью cudaBindTextureToArray(). Именно в отображении вы решаете, с какими данными оперировать.

В дополнение к API ссылки на текстуру, CUDA 5.0 теперь поддерживает API объекта текстуры. Вместо глобального определения ссылки на текстуру с помощью этого нового API теперь можно локально определить объект текстуры и передать его ядру в качестве аргумента функции. Ознакомьтесь с руководством по программированию CUDA (раздел 3.2.10.1.1).