Перейти к содержимому
Compvision.ru
mrgloom

gpu::mat

Recommended Posts

в связи с этой статьёй(хотя она и про opencl) стало интересно какую память используется gpu::mat(видимо глобальна память) и насколько её можно использовать так же просто как и обычный Mat?

простой пример, пишу программу просто для mat, заменяю на gpu::mat, т.е. специально не перестраиваю алгоритм под gpu, будет ли это работать?

если нет та надо лезть на более низкий уровень чем gpu::mat(написание kernel'ов, выделение разной памяти ) или как то еще?

Поделиться сообщением


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

При создании gpu::Mat выделяется память на GPU, после этого копируется (если создается из обычной матрицы) содержимое.

Копирование Host <-> Device очень медленная штука.

Если дергать ячейки GPU-шной памяти c хоста, то программа скорее замедлится относительно чисто CPU-шного варианта.

Обычно загружают данные на GPU, и стараются как можно дольше их оттуда не вытаскивать, использовать прямо на GPU.

OpenCV-ные функции (GPU-шные) работают с данными, уже загруженными на GPU, поэтому можно строить конвейер обработки не вытаскивая данные каждый раз на хост.

Если нужны какие-то нестандартные функции, тогда, естественно, надо писать ядра самому.

Поделиться сообщением


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

да это я то и так знаю ,вопрос не в этом.

допустим я загрузил матрицу на GPU и хочу с ней что то сделать.

могу ли я использовать тупо попиксельный доступ т.е. делать всё так же как и на CPU? т.е. меня как бы интересует интерфейс самого доступа, т.е. думать там о локальной\глобальной\кэшэ и т.д. не хочеться, по идее можно всё писать в глобальную память и не заморачиваться только тогда прирост будет не такой большой.Причем в CUDA programming guide там вроде было написано что для обработки изображений (там вроде еще был даже пример билатерального фильтра в сэмплах) можно использовать какую то специальную память типа текстуры или как то так, но там опять же кернелы писались вручную, а например есть тот же thrust(и еще cudatemplates )интерфейс как std и никаких кернелов.

кстати Jacket теперь часть Parallel Computing Toolbox матлаба

http://blog.accelereyes.com/blog/2012/12/12/exciting-updates-from-accelereyes/

Поделиться сообщением


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

Я писал как-то интерфейс к примерам NVIDIA (к фильтрам как раз) как это выглядело можно посмотреть в прикрепленных файлах.

CudaExp1.rar

Поделиться сообщением


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

посмотрел еще раз ваш код, по сути в *.cpp есть только ф-ия в которую передаётся GpuMat

DevMem2Df которое используется в *.cu файле похоже внутреннее и не задокументированное, и почему src передаётся как DevMem2Df,а dst PtrStepf (т.е. по сути просто указатель).

меня же интересовало возможно ли написание кода без кернелов, т.е. без *.cu файла, и чтобы к 2D матрице можно было бы обращаться попиксельно типа M[j].

Поделиться сообщением


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

Вообще говоря gpu::Mat по умолчанию аллоцирует память на девайсе (device memory), но если вы пишете код под SoC процессор(например новая NVIDIA Tegra K1 и ей подобные), то можно руками аллоцировать память в шарной памяти для CPU и GPU(unified memory) и просто перенацеливать указатель на память у gpu::Mat в нужное место при передачи этой памяти оптимизированным под GPU функциям.

Поделиться сообщением


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

Тестирую Canny на OpenCL (2.4.9) и результаты никуда не годятся:

в 4 раза медленнее cuda

в 6 раз медленнее простой Cpu реализации при том что в варианте OpenCL грузятся все ядра.

По начало грешил на .net врапер но проверил на с++ и результаты те же. Это opencl(конктретно Canny) в opencv настолько убог или я что то не так делаю?

Поделиться сообщением


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

На каком устройстве запускаешь? Имей в виду, что OpenCL реализацию оптимизируют большей частью под АМДшные видеокарты. В последнее время ещё под Интеловские Хазвелы. А у тебя...

Поделиться сообщением


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

nvidia 635m и core i5 Ivy Bridge. И на компах где это будет работать haswellа явно не будет в лучшем случае sandy bridg.

Поделиться сообщением


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

Понятно, тут с OpenCL особо ловить нечего - не то железо. Сейчас лучше всего именно для OpenCL покупать АМДшные карточки архитектуры GCN, последние Нвидиа (не младших серий как у тебя) и Интеловские Haswell.

Поделиться сообщением


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

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×