Category: компьютеры

Qt 5.4 + Qt Creator 3.3 на ODROID XU3

Прикупил тут я себе маленький компьютер. Без корпуса весит 48 граммов, жрёт 10 Ватт (20-ти ваттный источник питания, чтобы питать USB-флэшки и прочую мелочь), имеет на борту Arm-овский процессор с 4-мя ядрами Cortex™-A15 и 4-мя ядрами Cortex™-A7, плюс ещё шесть ядер GPU (Mali-T628 MP6). 2 Гигабайта оперативы (для Линукса более чем достаточно). Шесть портов USB (4 USB-2 + 2 USB-3), Ethernet, выход HDMI (на монитор), звуковой выход, вместо HDD микро-SD-карта. Практически полноценный комп, только слабая видюха, которая, тем не менее, поддерживает OpenCL. Для мобильных систем типа маленького робота просто идеальный вариант. По вычислительной мощности ЦП на уровне хорошего домашнего компа (восемь ядер как-никак). И 48 грамм (без проводов и блока питания :)).



Collapse )

OpenCL и утечки памяти, часть 2

(часть 1 здесь)

Нашёл ещё одну причину утечек памяти при работе с OpenCL. Она происходит, если забыть о требованиях к областям памяти, с которыми библиотека OpenCL обменивается данными. Одно из трёх требований гласит, что при копировании данных в OpenCL-евский объект памяти или из него этот объект не должен быть занят OpenCL-программой, другое требование гласит, что над ним в данный момент не должно производиться никаких других действий (например - другое копирование в или из данного объекта памяти), а третье требование гласит о том, что используемая область памяти, с которой происходит обмен данными, не должна быть отображённым в память устройством или файлом (The OpenCL Specification, пункт 5.2.2 Reading, Writing and Copying Buffer Objects).

Вот об этом третьем требовании я и забыл. Или не знал. И копировал данные прямо из буфера веб-камеры в видеокарту. А буфер веб-камеры является отображённым в память файловым устройством (в Линуксе данные из веб-камеры читаются как из файла). Поэтому когда с помощью OpenCL-функции clEnqueueWriteBuffer(...) программа копировала данные напрямую из буфера веб-камеры в видеокарту, каким-то непостижимым образом из системы пропадало около сорока килобайт свободной оперативной памяти. А поскольку каждый кадр веб-камеры надо обработать, а что бы обработать, его надо скопировать в видюху, а веб-камера выдаёт по 24 кадра в секунду, то каждую секунду из системы безвозвратно пропадало около мегабайта свободной памяти. В результате после примерно часа работы свободной памяти в системе не оставалось вовсе.

Как в общем уже понятно из всего сказанного, для устранения утечек памяти пришлось сперва копировать данные из буфера веб-камеры в специально для этого выделенный буфер в программе, а уже потом из этого буфера передавать данные на обработку в OpenCL (то есть в видеокарту).

Два дня мучился с этой проблемой.

ЗЫ: Тяжела и неказиста жизнь простого программиста.

OpenCL в Linux: Краткая инструкция для начинающих. Часть 1


Или "OpenCL для чайников".

Часть 1

Пока не забыл, как я осваивал OpenCL, решил написать краткую инструкцию на русском языке. Мало ли, вдруг кому пригодится?

Тут я должен сперва сказать о том, что я не только ненавижу Microsoft, но и не люблю Intel за их отвратительные крепления охладителей процессоров, которые имеют тенденцию к самопроизвольному отстёгиванию (это я знаю не понаслышке - сам видел). К тому же, при одинаковых капитальных затратах компьютер на AMD получается мощнее компьютера на Intel.

Ну а раз у меня стоят процессоры AMD на мамках с наборами микросхем всё от того же AMD, то я и видеокарты покупаю от AMD, то есть Radeon, тем более, что количество потоковых процессоров на видеокарте с GPU Radeon всегда заметно больше, чем на видеокарте с GPU от nVidia, опять же при их равной или близкой стоимости. К тому же OpenCL - это нечто открытое и более менее стандартное, а nVidia точила свои GPU под некую закрытую их собственную технологию CUDA. nVidia, конечно, выпустила драйвера с поддержкой OpenCL (а куда деваться?) в 2009-ом году, но я предпочитаю использовать GPU Radeon, поскольку они изначально затачивались как раз под открытую OpenCL технологию. Люблю всё открытое и бесплатное, гы :).

В связи с вышеизложенным всё, что я буду тут писать, относится к использованию OpenCL на видеокартах Radeon, с использованием набора разработчика AMD APP SDK для Linux.
Collapse )

OpenCL в Linux: Краткая инструкция для начинающих. Часть 2





Или "OpenCL для чайников".

Часть 2

Начало здесь

Теперь, когда у нас есть уже текст программы на OpenCL, нам надо подготовить её к выполнению.

Первое, что нам для этого надо сделать — это задать, скажем так, среду исполнения, или как это зовётся в OpenCL — context.

Сначала создадим список необходимых нам свойств (пока одно) контекста:



cl_context_properties clCProp[3] =

{ // В списке сидят имена параметров и их значения

CL_CONTEXT_PLATFORM, (cl_context_properties)platformID,

0 // Нолик означает конец списка

};

Collapse )

OpenCL

Наконец я разобрался в этой технологии достаточно для того, что бы читая примеры программ, прилагающиеся к SDK от AMD понимать, что эти программы делают.

Вообще - прикольный язык. Сами OpenCL-программы по задумке создателей OpenCL должны храниться в текстовом виде и компилироваться под конкретную железку подключаемыми библиотеками во время выполнения основной программы. Однако тут встаёт вопрос о том, что делать, если автор не хочет показывать своё, так сказать, НоуХау, распространяя программы в исходных кодах.

Есть вариант, правда, хранить исходные тексты прямо в переменных уже откомпилированной основной программы, можно в закодированном виде, что бы затруднить к ним доступ. И возникает один очень интересный вариант работы с программами OpenCL: теоретически можно создать такую основную программу, которая будет сама создавать различные варианты сочетаний заранее заготовленных элементарных действий  с целью выявления наиболее эффективных алгоритмов для решения тех или иных задач. Различные сочетания действий можно находу компилировать и запускать на графических процессорах и затем, сравнивая полученные результаты с заранее заготовленными эталонами, проверять эффективность полученной OpenCL-программки.

Прикольно было бы попробовать. Задал так программе попробовать всё и вся, и спать пошёл, а она за тебя эволюционным путём эффективные алгоритмы отбирает.

Qt 4.7 и OpenCL 1.1 в OpenSUSE 11.3


Захотелось испробовать возможности паралельных вычислений с использованием OpenCL. Для первого знакомства с этим языком программирования (который по сути является расширением языка C), я решил скачать какой-нибудь SDK (Software Development Kit или по-русски говоря Набор для Разработки Программ) и посмотреть, насколько это действенная штука. Довольно быстро обнаружил ATI_STREAM_SDK от AMD (ATI теперь принадлежит AMD). Почитал описание, обнаружил, что моя купленная пару лет назад видеокарта уже безнадёжно устарела и не поддерживает OpenCL. Кроме того, у меня уже устаревшая система (OpenSUSE 11.1), которая не поддерживается этим самым SDK. Но были и хорошие новости: ATI_STREAM_SDK обещал поддержку работы с процессорами, имеющими мультимедийные возможности (набор команд SSE). Таким образом, что бы отпробовать хотя бы какую-то часть новой для себя технологии, мне было достаточно заменить систему на OpenSUSE 11.3 и установить на неё ATI_STREAM_SDK.

Collapse )