mrgloom 242 Жалоба Опубликовано June 24, 2013 в связи с этой статьёй(хотя она и про opencl) стало интересно какую память используется gpu::mat(видимо глобальна память) и насколько её можно использовать так же просто как и обычный Mat? простой пример, пишу программу просто для mat, заменяю на gpu::mat, т.е. специально не перестраиваю алгоритм под gpu, будет ли это работать? если нет та надо лезть на более низкий уровень чем gpu::mat(написание kernel'ов, выделение разной памяти ) или как то еще? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано June 24, 2013 При создании gpu::Mat выделяется память на GPU, после этого копируется (если создается из обычной матрицы) содержимое. Копирование Host <-> Device очень медленная штука. Если дергать ячейки GPU-шной памяти c хоста, то программа скорее замедлится относительно чисто CPU-шного варианта. Обычно загружают данные на GPU, и стараются как можно дольше их оттуда не вытаскивать, использовать прямо на GPU. OpenCV-ные функции (GPU-шные) работают с данными, уже загруженными на GPU, поэтому можно строить конвейер обработки не вытаскивая данные каждый раз на хост. Если нужны какие-то нестандартные функции, тогда, естественно, надо писать ядра самому. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано June 25, 2013 да это я то и так знаю ,вопрос не в этом. допустим я загрузил матрицу на GPU и хочу с ней что то сделать. могу ли я использовать тупо попиксельный доступ т.е. делать всё так же как и на CPU? т.е. меня как бы интересует интерфейс самого доступа, т.е. думать там о локальной\глобальной\кэшэ и т.д. не хочеться, по идее можно всё писать в глобальную память и не заморачиваться только тогда прирост будет не такой большой.Причем в CUDA programming guide там вроде было написано что для обработки изображений (там вроде еще был даже пример билатерального фильтра в сэмплах) можно использовать какую то специальную память типа текстуры или как то так, но там опять же кернелы писались вручную, а например есть тот же thrust(и еще cudatemplates )интерфейс как std и никаких кернелов. кстати Jacket теперь часть Parallel Computing Toolbox матлаба http://blog.accelereyes.com/blog/2012/12/12/exciting-updates-from-accelereyes/ Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано June 25, 2013 Я писал как-то интерфейс к примерам NVIDIA (к фильтрам как раз) как это выглядело можно посмотреть в прикрепленных файлах. CudaExp1.rar Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 13, 2014 посмотрел еще раз ваш код, по сути в *.cpp есть только ф-ия в которую передаётся GpuMat DevMem2Df которое используется в *.cu файле похоже внутреннее и не задокументированное, и почему src передаётся как DevMem2Df,а dst PtrStepf (т.е. по сути просто указатель). меня же интересовало возможно ли написание кода без кернелов, т.е. без *.cu файла, и чтобы к 2D матрице можно было бы обращаться попиксельно типа M[j]. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BeS 53 Жалоба Опубликовано February 13, 2014 Вообще говоря gpu::Mat по умолчанию аллоцирует память на девайсе (device memory), но если вы пишете код под SoC процессор(например новая NVIDIA Tegra K1 и ей подобные), то можно руками аллоцировать память в шарной памяти для CPU и GPU(unified memory) и просто перенацеливать указатель на память у gpu::Mat в нужное место при передачи этой памяти оптимизированным под GPU функциям. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
iskees 32 Жалоба Опубликовано April 24, 2014 Тестирую Canny на OpenCL (2.4.9) и результаты никуда не годятся: в 4 раза медленнее cuda в 6 раз медленнее простой Cpu реализации при том что в варианте OpenCL грузятся все ядра. По начало грешил на .net врапер но проверил на с++ и результаты те же. Это opencl(конктретно Canny) в opencv настолько убог или я что то не так делаю? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано April 24, 2014 На каком устройстве запускаешь? Имей в виду, что OpenCL реализацию оптимизируют большей частью под АМДшные видеокарты. В последнее время ещё под Интеловские Хазвелы. А у тебя... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
iskees 32 Жалоба Опубликовано April 24, 2014 nvidia 635m и core i5 Ivy Bridge. И на компах где это будет работать haswellа явно не будет в лучшем случае sandy bridg. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано April 24, 2014 Понятно, тут с OpenCL особо ловить нечего - не то железо. Сейчас лучше всего именно для OpenCL покупать АМДшные карточки архитектуры GCN, последние Нвидиа (не младших серий как у тебя) и Интеловские Haswell. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах