#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