Используете ли вы возможности OpenCL для ускорения расчетов? (и обсуждение применения в торговле) - страница 5

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Попробуем для разминки решить следующую задачку:
Отправить в кернел массив из двух элементов, поменять значения элементов местами и вернуть обратно.
Второй вариант решения:
Основная программа.
Код кернел-программы, подключенный к основной программе как ресурс.
Перейдём к несколько более сложной задаче.
Попробуем максимально перенести в кернел расчет (пока без распараллеливания и оптимизации) следующего индикатора:
Перейдём к несколько более сложной задаче.
Попробуем максимально перенести в кернел расчет (пока без распараллеливания и оптимизации) следующего индикатора:
Просмотрел этот пример и не понял где собственно осуществляется перенос в кернел?
А если свернуть расчетные функции самого индикатора (которых может быть сколько угодно), и показать сам принцип переноса большого количества функций в кернел (OpenCL)?
Иначе говоря, среди функций которые нужно перенести, сложно найти сам код который переносит и понять главный принцип этого переноса.
Как его сформулировать?
Спасибо.
Просмотрел этот пример и не понял где собственно осуществляется перенос в кернел?
А если свернуть расчетные функции самого индикатора (которых может быть сколько угодно), и показать сам принцип переноса большого количества функций в кернел (OpenCL)?
Иначе говоря, среди функций которые нужно перенести, сложно найти сам код который переносит и понять главный принцип этого переноса.
Как его сформулировать?
Спасибо.
Это не решение, а собственно только постановка задачи. Ожидайте решения...
Это не решение, а собственно только постановка задачи. Ожидайте решения...
Перенос расчетов индикатора в кернел. Промежуточный вариант - показаны основные отличия.
Интерфейс.
Было:
Стало:
Добавлен OCLSelector для выбора варианта расчета: с использованием или без использования OpenCL.Инициализация расчетных буферов.
Было:
Стало:
Перенос расчетных массивов в индикаторные.
Было:
Стало:
Расчет по Куину-Фернандесу.
Было:
Стало:
Добавлена функция TrigFitOCL():
Добавлена функция ShutDown():
Добавлен ресурс:
Полные тексты - во вложении.
Перенос расчетов индикатора в кернел. Промежуточный вариант - показаны основные отличия.
Интерфейс.
Было:
Стало:
Инициализация расчетных буферов.
Было:
Стало:
Перенос расчетных массивов в индикаторные.
Было:
Стало:
Расчет по Куину-Фернандесу.
Было:
Стало:
Добавлена функция TrigFitOCL():
Добавлена функция ShutDown():
Добавлен ресурс:
Полные тексты - во вложении.
А Вы можете изложить основные правила и функции переноса расчетов в кернел?
Иначе получается гора кода из которой трудно извлечь смысл осуществляемых действий.
Спасибо.
А Вы можете изложить основные правила и функции переноса расчетов в кернел?
Иначе получается гора кода из которой трудно извлечь смысл осуществляемых действий.
Спасибо.
1. В данном случае предпринималась просто попытка переноса кода функции
TrigFit()
из MQL в среду исполнения OpenCL.
Никакая оптимизация и распараллеливание не производились.
2. Код самих исполняемых функций для MQL и OpenCL практически идентичен.
MQL (в теле программы):
OpenCL (файл LibreFEI_v1.006.cl):
Поэтому основная задача заключалась в записи программы в кернел, передаче ей параметров, запуске программы и получению результатов её работы.
Подготовительные операции по настройке среды исполнения OpenCL являются однократно выполняемыми. Это:
1. Создание контекста (среды) для программы OpenCL (выбор устройства - видеокарта): CLContextCreate(CL_USE_ANY).
2. Создание в контексте (среде исполнения на устройстве) программы на основе кода передаваемого через строку CL_Source: CLProgramCreate(h_CL_Context,CL_Source,BuildLog).
3. Создание кернела для расчета значений функции: CLKernelCreate(h_CL_Program,CL_Kernel_Name).
4. Создание буферов для массивов передаваемых в кернел по ссылке и для возвращаемых значений: CLBufferCreate(h_CL_Context,Npast*sizeof(double),CL_MEM_READ_WRITE) и др.
1. В данном случае предпринималась просто попытка переноса кода функции
TrigFit()
из MQL в среду исполнения OpenCL.
Никакая оптимизация и распараллеливание не производились.
2. Код самих исполняемых функций для MQL и OpenCL практически идентичен.
MQL (в теле программы):
OpenCL (файл LibreFEI_v1.006.cl):
Поэтому основная задача заключалась в записи программы в кернел, передаче ей параметров, запуске программы и получению результатов её работы.
Я предлагаю разобрать каждую функцию OpenCL. Что она делает, как и зачем. Все на практических примерах.
Возвращает тип OpenCL хендла в виде значения из перечисления ENUM_OPENCL_HANDLE_TYPE
Возвращает значение целочисленного свойства для OpenCL-объекта или устройства
CLGetInfoString
Возвращает строковое значение свойства для OpenCL-объекта или устройства
Cоздает контекст OpenCL
Удаляет контекст OpenCL
Получает свойство устройства из OpenCL драйвера
Создает OpenCL программу из исходного кода
Удаляет OpenCL программу
Создает функцию запуска OpenCL
Удаляет функцию запуска OpenCL
Выставляет параметр для функции OpenCL
CLSetKernelArgMem
Выставляет буфер OpenCL в качестве параметра функции OpenCL
CLSetKernelArgMemLocal
Задаёт локальный буфер в качестве аргумента kernel-функции
Создает буфер OpenCL
Удаляет буфер OpenCL
Записывает массив в буфер OpenCL и возвращает количество записанных элементов
Читает буфер OpenCL в массив и возвращает количество прочитанных элементов
Выполняет OpenCL программу
Возвращает состояние выполнения OpenCL программы
Вот все функции. Необходимо простым и понятным языком описать для чего нужна каждая функция и привести маленький конкретный пример. Тогда все будет ясно.
Поэтому основная задача заключалась в записи программы в кернел, передаче ей параметров, запуске программы и получению результатов её работы.
Некоторые подготовительные операции по настройке среды исполнения OpenCL являются однократно выполняемыми. Это:
1. Создание контекста (среды) для программы OpenCL (выбор устройства - видеокарта): CLContextCreate(CL_USE_ANY).
2. Создание в контексте (среде исполнения на устройстве) программы на основе кода передаваемого через строку CL_Source: CLProgramCreate(h_CL_Context,CL_Source,BuildLog).
3. Создание кернела для расчета значений функции: CLKernelCreate(h_CL_Program,CL_Kernel_Name).
4. Создание буферов для массивов передаваемых в кернел по ссылке: CLBufferCreate(h_CL_Context,Npast*sizeof(double),CL_MEM_READ_WRITE) и др.
Хорошо. Подготовительные операции понятны.