Массивы Cuda 2d или 3d

#cuda

#cuda

Вопрос:

Я имею дело с набором изображений (размером 2k x 2k)
Мне нужно выполнить операции с каждым пикселем в стеке из нескольких последовательных изображений.

Есть ли какие-либо мнения об использовании одной 2D большой текстуры вычислении смещений по сравнению с использованием 3D массивов?

Кажется, что 3D-массивы немного «выбились из общего ряда» в CUDA api, функции передачи распределения сильно отличаются от тех же 2D-функций.

Похоже, что нет никакой хорошей документации о более высоком уровне «как и почему» CUDA, а не о конкретных вызовах

Существует руководство по передовым методам, но в нем это не рассматривается

Комментарии:

1. Вы читаете изображения несколько раз? В противном случае использование текстур кажется многовато..

2. @pavan Я загружаю видеоряд на карту и выполняю некоторую обработку изображений, а затем рендерю обработанное видео. Использование opengl PBO казалось самым простым подходом

3. Лично я избегаю использования текстур, в первую очередь потому, что их документация плохая. Кроме того, связывание и развязывание текстур занимает много времени. Однако я не могу комментировать использование текстур cuda и opengl PBO.

Ответ №1:

Я бы порекомендовал вам прочитать книгу «Cuda на примере». В нем рассматриваются все эти вещи, которые также не задокументированы, и объясняется, «как и почему».

Я думаю, что при рендеринге результата ядра CUDA вам следует использовать взаимодействие OpenGL. Таким образом, ваш код обрабатывает изображение на графическом процессоре и оставляет обработанные данные там, что значительно ускоряет его визуализацию. В книге есть хороший пример того, как это делается.

Если каждому потоку CUDA требуется считывать только один пиксель из первого кадра и один пиксель из следующего кадра, вам не нужно использовать текстуры. Текстуры приносят вам пользу, только если каждый поток считывает несколько последовательных пикселей. Поэтому вам лучше всего использовать 3D-массив.

Комментарии:

1. Я читал это, но 3D-массивы — это новая функция, которая не описана в книге. Использование текстур значительно упрощает взаимодействие с OpenGL, и большинство процедур обработки изображений в любом случае получают доступ к соседним пикселям.

2. Конечно, нет проблем с использованием текстур. Если вы планируете использовать небольшое количество фреймов, то вы можете просто определить несколько текстур 1D или 2D textures текстуры. Вы упомянули, что вы делаете что-то от кадра к кадру, поэтому вам просто нужны 2 текстуры, скажем, текстуры A и B. Вы загружаете кадры 1 и 2 в A и B, а затем ваше ядро обрабатывает A и B. Затем вы просто заменяете кадр 1 кадром 3, и ваше ядро затем обрабатывает текстуры B и A (в таком порядке), что эквивалентно обработке кадров 2 и 3.

3. @r2jitsu — это в значительной степени то, что я сделал. поддержка cuda для массивов текстур оставляет желать лучшего, а 3d-формат сбивал с толку, поэтому я просто увеличил текстуру в N раз и обработал кадры, подлежащие обработке.

Ответ №2:

Вот пример использования массивов CUDA и 3D cuda:https://github.com/nvpro-samples/gl_cuda_interop_pingpong_st