Или «OpenCL для чайников».
Теперь, когда у нас есть уже текст программы на OpenCL, нам надо подготовить её к выполнению.
Первое, что нам для этого надо сделать — это задать, скажем так, среду исполнения, или как это зовётся в OpenCL — context.
Сначала создадим список необходимых нам свойств (пока одно) контекста:
cl_context_properties clCProp[ 3 ] =
CL_CONTEXT_PLATFORM , ( cl_context_properties ) platformID ,
0 // Нолик означает конец списка
Затем с помощью этого списка и функции clCreateContextFromType получим собственно вот этот самый контекст:
cl_context context = clCreateContextFromType (clCProp, CL_DEVICE_TYPE_GPU , NULL , NULL ,
В данном случае мы получаем контекст для указанной нами платформы ( platformID ), причём только для графических процессоров. Параметры NULL, NULL — это указание на то, что у нас пока нет функции для обратного вызова драйвером (ну не нужна пока), и каких-то особых данных для этой функции.
OpenCL vs Cuda Rendering (GTX 650 vs 7770, FX 6300)
В переменную ret драйвер вернёт нам ошибку или значение CL_SUCCESS (обработка ошибок опущена, что бы не загромождать текст).
Теперь мы можем создать очередь команд (сами команды в эту очередь ставить будем потом)
cl_command_queue_properties prop = 0 ; // никаких особых свойств не надо пока
cl_command_queue commandQueue = clCreateCommandQueue ( context , myDevices IDs[0] , prop,
Теперь надо подготовить OpenCL-буферы, в которые мы будем загружать потом наши данные (входящий и исходящий буферы):
cl_mem inputImageBuffer = clCreateBuffer ( context , CL_MEM_READ_ONLY , inputSize , 0 ,
/* предпоследний нолик — это значит нет указателя на участок в обычной памяти, и не будем хранить данные в общей куче, а будем копировать в видюху. */
cl_mem outputImageBuffer = clCreateBuffer ( context , CL_MEM_READ_WRITE , outputSize , 0 ,
/* предпоследний нолик — это значит нет указателя на участок в обычной памяти, и не будем хранить данные в общей куче, а будем держать данные в видеокарте, пока не запустим копирование в обычную память. */
Тут надо заметить, что при получении потокового видео я использую три реальных буфера в памяти своей программы — пока драйвер веб-камеры копирует в один буфер очередной кадр, я работаю с другим буфером. Три буфера используются для надёжности, что бы уменьшить вероятность коллизии в случае тормозов в программе. Поэтому при создании OpenCL-буферов никакие адреса указывать нельзя — они всё время меняются, с каждым очередным кадром потокового видео. Передаём в функции создания OpenCL-буферов только требуемые размеры.
Ещё один важный момент: в Линуксе получение данных из веб-камеры выглядит как чтение из файла. При этом устройства и файлы для удобства можно отобразить в оперативную память (функцией mmap(. )). После отображения файла/устройства в память данные из него можно получать, копируя содержимое буферов, на которые отображено устройство/файл. В этом случае если при копировании данных в видеокарту функцией clEnqueueWriteBuffer (. ) мы будем копировать данные из памяти, на которую отображено устроство/файл , результат может оказаться неожиданным. (В спецификации OpenCL так и написано.) Когда я попробовал так сделать, в моей системе начались довольно серьёзные утечки памяти. Поэтому в случае обработки данных, получаемых от устройств, отображённых в память, надо сначала скопировать данные в обычный буфер вашей программы, а уже из этого буфера передавать данные в видеокарту.
Вебинар «Вычисляем на видеокартах. Технология OpenCL»
Теперь мы даём драйверу указание создать объект-программу из исходного текста:
int sourceSize = strlen ( YUYVtoBGRprog );
cl_program program = clCreateProgramWithSource ( context , 1 ,
(( const char **)sourceSize,
Теперь уже строим исполняемый код программы:
В данном случае мы строим программу только для самого первого из обнаруженных в нашей системе устройств (да, для разных устройств — разный код). Пятый параметр, передаваемый этой функции — это наша программка, которую драйвер вызовет по окончании создания кода нашей программы. В этой функции мы можем узнать о результатах сборки с помощью функции clGetProgramBuildInfo:
CL_CALLBACK void myOpnCLCallBack ( cl_program program, void *user_data)
<
openCLClass *owner = ( openCLClass *)user_data; // ссылка на наш объект, в котором всё хранится
cl_build_status stat;
size_t t = 0 ;
cl_int ret = clGetProgramBuildInfo (program, stat,
В переменной stat к нам возвращается результат работы строителя программы.
if (stat == CL_BUILD_IN_PROGRESS)
<
return ; // значит программа пока строится
>
else if (stat == CL_BUILD_ERROR)
< /* ошибочка вышла, не построится программа. Здесь надо получить ошибки от компилятора OpenCL, смотрим описание — там всё подробно, я это опускаю */
>
else if (stat == CL_BUILD_SUCCESS)
< // Программа построена, можно грузить в видюху
/* вот тут, собственно, и создаётся уже рабочий объект типа cl_kernel — как я понимаю, это уже ну окончательно, совсем-совсем почти готовая к исполнению программа */
owner-> kernel = clCreateKernel (program, «YUYVtoBGRkernel» , //owner->program
/* Осталось только указать программе, что будет выступать в качестве аргументов в функции
«__kernel void YUYVtoBGRkernel(__global uchar4 *y, __global uchar8 *r)» */
stat = clSetKernelArg (owner-> kernel , 0 , sizeof ( cl_mem ), inputImageBuffer );
stat = clSetKernelArg (owner-> kernel , 1 , sizeof ( cl_mem ), outputImageBuffer );
В качестве аргументов у нас inputImageBuffer и outputImageBuffer. Нулевым номером (нолик) идёт inputImageBuffer, а первым номером outputImageBuffer.
Но и это ещё не всё. Прежде, чем запускать нашу программу на выполнение, ей надо передать данные для копирования во входящий буфер.
// Ставим в очередь копирование из входящего буфера в память видюхи
cl_int stat = clEnqueueWriteBuffer ( commandQueue , inputImageBuffer , CL_TRUE , 0 , inputSize , inputBuff, 0 , 0 , 0 );
inputBuff — это указатель на данные, которые передаются в видеокарту. InputSize — размер этих данных. Третьим параметром здесь идёт значение CL_TRUE , которое говорит о том, что функция clEnqueueWriteBuffer не вернётся, пока данные не будут скопированы. Таким образом мы предохраняемся от возможности запустить на выполнение нашу программу до того, как в видеокарте окажутся исходные данные.
Есть возможность передать в эту функцию ссылку на объект cl_event (событие), и тогда эта функция должна будет по завершению копирования внести в этот объект соответствующие изменения, ориентируясь на которые можно действовать дальше. Тут я не стал пока заморачиваться, и с блокирующим копированием неплохо работает.
И, наконец, запускаем уже нашу многострадальную программу на выполнение:
cl_event events [ 2 ];
cl_event eventSentData [ 2 ];
size_t globalThreads[] = < numOfElems >;
//size_t localThreads[] = ;
cl_int stat = clEnqueueNDRangeKernel ( commandQueue , kernel , 1 , NULL , globalThreads, NULL , 0 , 0 ,
В переменной globalThreads передаём количество тех самых элементов во входящем и в исходящем буферах, которые наша программа должна будет обработать. Основываясь на этом параметре наша программа будет вычислять тот самый индекс, который получается функцией «uint m = get_global_id(0);» . Также передаём ссылку на объект cl_event, что бы читать из видео-карты данные не раньше, чем наша OpenCL-программка закончит обработку данных. Чтение данных из видеокарты осуществляем с помощью функции clEnqueueReadBuffer :
cl_int stat = clEnqueueReadBuffer ( commandQueue , outputImageBuffer ,
CL_FALSE , 0 , outputSize , outputBuff, 1 , events ,
Здесь outputSize и outputBuff — это соответственно размер данных для чтения из видеокарты и указатель на буфер, в который это всё надо скопировать. И кстати, два предпоследних параметра здесь (1, events) обозначают, что надо проверить один (первый) объект cl_event из массива объектов cl_event events [ 2 ] . Этот объект должна изменить функция clEnqueueNDRangeKernel, когда она закончит обработку переданных ей данных. Соответственно, копирование данных начнётся только тогда, когда обработка данных уже закончилась. В третий параметр этой функции мы передаём значение CL_FALSE , что как раз и значит, что вызов этой функции «не блокирующий», то есть он немедленно возвращает управление в нашу программу, а выполнение этой функции откладывается до момента, когда произойдёт событие events [ 0 ] .
Что бы избежать возможных накладок, а именно повторного вызова этой процедуры и использования буферов ввода-вывода нашей OpenCL-программки до того, как обработанные выходные данные будут скопированы в буфер основной программы, после запуска процедуры копирования с lEnqueueReadBuffer ( . ) желательно вызвать процедуру
она позволит нам дождаться окончания процесса копирования данных в основную программу, и позволит нам после этого освободить ресурсы, отожранные библиотекой OpenCL под данные событий:
clReleaseEvent( events [0]);
clReleaseEvent( eventSentData [0]);
Если этого не сделать, ресурсы, отводимые под тысячекратно повторяемые события (в случае обработки видео-потока) постепенно израсходуют всю доступную в системе память.
Последние вызываемые функции (начиная с копирования данных в память видюхи) можно уже вызывать в цикле — программа по завершению никуда не девается, а остаётся в рабочем состоянии. У меня эти три функции вызываются по 10-20-30 раз в секунду (с такой частотой поступают кадры с веб-камеры, зависит от размера кадра).
Когда мы решили уже выключить наше потоковое видео, надо освободить все ресурсы, которые мы заняли в процессе подготовки и создания нашей OpenCL-программы:
clReleaseKernel( kernel );
clReleaseProgram( program );
clReleaseMemObject( inputImageBuffer );
clReleaseMemObject ( outputImageBuffer );
clReleaseCommandQueue ( commandQueue );
clReleaseContext ( context );
На этом и заканчивается полный цикл жизни OpenCL-программы. Создание её, конечно, довольно муторное, особенно если учесть, что надо ещё возможные ошибки обрабатывать, что я здесь опустил, зато если сделать соответствующий класс, можно заметно упростить написание этой рутины (ну, я так и сделал).
Зато, OpenCL даёт доступ к действительно немаленькой мощности, которую можно купить за совсем небольшие деньги. К примеру, цены на видеокарты с процессорами AMD Radeon HD 6770 в Москве начинаются от 3400 рублей (сильно подешевели с лета, как я погляжу). Между тем, этот графический процессор имеет на борту 800 потоковых процессоров (ядер) и выдаёт 1,36 терафлопа пиковой мощности при обработке данных одинарной точности. Видеокарты с двухтерафлопным Radeon HD 6870 c 1120-ю потоковыми процессорами начинаются от 6300 рублей.
С двойной точностью могут работать только ГП Radeon начиная с серии 69ХХ (на данный момент это топовые модели). Впрочем, двойная точность пока мало кому требуется.
Источник: diman-novik-ru.livejournal.com
Open cl что это за программа и нужна ли она
главное отличие между OpenGL и OpenCL является то, что OpenGL используется для графического программирования, в то время как OpenCL используется для гетерогенных вычислений.
И OpenGL, и OpenCL находятся под управлением Khronos Group. OpenGL позволяет писать программы для выполнения графических операций, тогда как OpenCL позволяет писать программы для разнородных систем, состоящих из нескольких процессоров. Оба они написаны с использованием языка Си.
Ключевые области покрыты
1. Что такое OpenGL
— определение, особенности
2. Что такое OpenCL
— определение, особенности
3. В чем разница между OpenGL и OpenCL
— Сравнение основных различий
Основные условия
Что такое OpenGL
OpenGL — это API для рендеринга 2D и 3D векторной графики. Это один из самых популярных API для написания графических программ. Он используется в научной визуализации, проектировании видеоигр, имитации полета, а также в автоматизированном проектировании (CAD) в машиностроении и т. Д.
OpenGL состоит из уже определенных функций, и программист может использовать их в своих программах напрямую. Мы можем создавать 2D (Треугольник, Полигоны и Шестиугольники и т. Д.) И 3D-объекты (Куб, Сфера и Тора и т. Д.), Используя OpenGL. Также возможно выполнять масштабирование, перевод, вращение, заливку цветов и заливку, а также добавление взаимодействий устройств ввода. Кроме того, мы можем выполнять смешивание, наложение текстур, анимацию, добавление атмосферных эффектов (туман, дым и т. Д.), Проекции и т. Д. С помощью OpenGL.
Что такое OpenCL
Гетерогенная система — это система, которая использует больше процессоров или ядер для повышения производительности. Процессоры могут быть похожими или разными в зависимости от задачи. OpenCL — это фреймворк, который помогает писать программы для разнородных систем. Таким образом, программист может использовать OpenCL для написания программ для систем с несколькими ЦП, графическими процессорами, процессорами цифровых сигналов (DSP), полевыми программируемыми массивами шлюзов (FPGA) и т. Д. Кроме того, он позволяет выполнять параллельные вычисления с использованием параллелизма на основе задач и данных.
Ядро — это функция, которая выполняется на устройстве OpenCL. OpenCL определяет интерфейс прикладного программирования (API), позволяющий программам, запущенным на хосте, запускать ядра на вычислительных устройствах и управлять памятью устройства. Кроме того, он предоставляет язык, похожий на C, для написания программ. Он имеет API для C, C ++ и других языков и технологий, таких как Python, Java, Perl, NET и т. Д.
Разница между OpenGL и OpenCL
Определение
OpenGL — это кроссплатформенный интерфейс прикладного программирования (API) для визуализации 2D и 3D векторной графики, в то время как OpenCL — платформа для написания программ, которые выполняются на разнородных платформах. Таким образом, в этом главное отличие OpenGL от OpenCL.
Длинная форма
OpenGL расшифровывается как Open Graphics Library, а OpenCL обозначает Open Computing Language.
Оригинальный Автор
Первоначальным автором OpenGL был Silicon Graphics, а первоначальным автором OpenCL был Apple Inc.
язык
Другое отличие OpenGL от OpenCL заключается в том, что OpenGL написан на C, а OpenCL написан на C с привязкой к C ++.
использование
Использование является основным отличием между OpenGL и OpenCL. OpenGL используется для выполнения 2D и 3D графических операций, в то время как OpenCL используется для написания программ для разнородных систем с несколькими процессорами, графическими процессорами, DSP и FPGA и т. Д.
Основное различие между OpenGL и OpenCL заключается в том, что OpenGL используется для графического программирования, а OpenCL — для разнородных вычислений. OpenGL используется в проектировании видеоигр, симуляции и т. Д. OpenGL помогает повысить производительность системы и позволяет выполнять параллельные вычисления.
Ссылка:
1. «OpenGL». Википедия, Фонд Викимедиа, 29 января 2019 г.,
Источник: ru.strephonsays.com
opencl.dll
Практически каждый пользователь компьютера использует принтер, чтобы распечатывать какие-либо документы или изображения. За выполнение функций связанных с печатью отвечает dll-библиотека opencl.dll, он содержится в файловой системе OpenAL. Часто пользователь может столкнуться с проблемой, когда какая-то программа повредила opencl.dll и функция печати стала не возможна. Данная проблема требует решения, поскольку с ней пользователь не сможет что-либо распечатать.
Для исправления ошибки, из-за которой возникла проблема, есть два основных способа:
- Переустановить OpenAL, содержащий в себе файл opencl.dll
- Скачать opencl.dll для Windows 7/8/10
Переустановка OpenAL позволит без лишних усилий переустановить opencl.dll автоматически. Это связанно с тем, что данный файл входит в файловый пакет программного обеспечения и в процессе установки всё устанавливается независимо от пользователя.
Скачать opencl.dll является решением более детальным, но при этом надежным. Необходимо скачать файл х32-64 бит в соответствии с разрядностью системы. Скачав файл, расположите его в соответствующей системной папке. Для окончания установки необходимо зарегистрировать файл, и перезагрузить компьютер.
Источник: dllmix.ru
Что за ошибка OpenCL.dll, как исправить?
Операционная система Виндовс не может похвастаться непревзойденной надежностью и отсутствием ошибок. Доказательством тому является наш сайт, который рассказывает о способах устранения подобных неисправностей. Сегодня расскажем о ситуации – отсутствует opencl.dll, скачать для Windows 10 сможете на этой странице для избавления от дефекта, возникающего при запуске разных приложений, игр.
Суть проблемы с файлом opencl.dll
Данная динамическая библиотека (DLL) нередко повреждается в результате воздействия вирусов, при нарушениях в системном реестре, в процессе использования нелицензионного софта и т.д. А в последнее время многие юзеры на форумах жалуются, что к подобному дефекту привели трояны-майнеры. Именно после их проникновения в Виндовс появилась неисправность.
О скрытом майнинге и его последствиях я подробно рассказывал в одной из предыдущих публикаций – идем по ссылке и разбираемся с вредоносными программами. Opencl.dll что это за ошибка? Стоит отметить, что данный элемент необходим для одновременного включения основного процессора и графического адаптера, необходимых для обработки ресурсоемких задач. Например, когда запускаете игру или фоторедактор Photoshop. И когда файл отсутствует или поврежден, то на экране появляется окно с ошибкой.
Как исправить?
- Необходимо opencl.dll скачать для Windows 10 по ссылке ;
- Будет загружен архив ZIP, внутри которого найдете нужный объект;
- Копируем его в следующие папки:
C | Windows | System32
C | Windows | SysWOW64
Второй путь отсутствует в системах с разрядностью 32 бит (x86), поэтому не расстраивайтесь, если не сможете найти её у себя.
- После копирования придется выполнить регистрацию компонента. Для этого запускаем командную строку с правами админа:
Или же используем в запросе полный путь (если вышеуказанный вариант не сработал) – смотрите пример трёх команд на скриншоте:
- Перезагрузите ПК.
Если ошибка снова появиться в момент запуска Windows 7 (или любой другой версии), значит стоит отключить в автозагрузке приложение, которое обращается к библиотеке. Нажмите Ctrl + Shift + Esc для открытия диспетчера задач и на соответствующей вкладке деактивируйте проблемную программу (обычно её название указывается в окне с ошибкой opencl):
Автор рекомендует:
- Убираем второй Windows из списка загрузки
- При запуске приложения 0xe06d7363 что это за ошибка, как исправить?
- Что делать, если mscorsvw.exe грузит процессор?
Другие способы
Теперь перейдем к методам, которые помогают не всем, но иногда чудеса случаются.
- Обновите драйвера оборудования, особенно важно получить актуальный апдейты для видеоадаптера. Используйте для этой цели официальные сайты производителей. А если не знаете, кто выпустил графическую карту, то стоит прибегнуть к автоматическому обновлению через утилиту IOBit Driver Booster:
На форумах прочитал, что для nVidia характерна обратная ситуация – когда с новыми «дровами» ошибка есть, а после отката к предыдущей версии – исчезает. Стоит опробовать и такой путь.
- Оптимизация реестра, удаление неверных записей также может помочь в исправлении ошибки. Я не рекомендую новичкам вручную ковыряться в столь тонких настройках. Проще установить бесплатное ПО CCleaner и выполнить очистку за пару минут. Вот ссылка на скачивание и видео инструкцию;
- В самом крайнем случае придется переустановить Виндовс. Если нет возможности приобрести лицензию и намерены качать «пиратку», то отдавайте предпочтение версиям 64 bit, и чтобы из них ничего не было вырезано.
- Используем Dll Helper:
DLL-Помощник
Что за ошибка, как её исправить — скачать opencl.dll для Windows 10, с этими вопросами разобрались. Очень надеюсь, что инструкция помогла Вам.
Источник: it-tehnik.ru