Используете ли вы возможности OpenCL для ускорения расчетов? (и обсуждение применения в торговле) - страница 6
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Хорошо. Подготовительные операции понятны.
Основные расчетные операции.
Функция TrigFitOCL() является в некотором роде посредником между MQL программой и программой OpenCL.
Её MQL интерфейс аналогичен функции TrigFit(), используемой для расчетов средствами MQL без использования OpenCL.
А её интерфейсом со стороны кернел-программы является последовательность функций управляющих передачей данных,
запуском кернел-программы, и получением данных из кернела.
Функция TrigFitOCL() выполняется многократно, в цикле и содержит следующие операции обращения к кернелу:
1. Установка в качестве параметра c номером 0 функции OpenCL (кернела) буфера по хендлу h_CL_Buffers[0]: CLSetKernelArgMem(h_CL_Kernel,0,h_CL_Buffers[0])
и аналогичные команды назначения буферов для параметров функции кернела. Параметры кернела нумеруются подряд и их количество может
не быть равно количеству буферов (некоторые входные параметры передаются без использования буферов). Буферизованные значения передаются по ссылке.
Я не смог найти способа возвращать значения простых (не структурных) типов из кернела, кроме как через использования массива из одного элемента.
Поэтому для таких переменных тоже назначаются буфера.
2. Установка в качестве 2-го параметра функции OpenCL (кернела) значения переменной n: CLSetKernelArg(h_CL_Kernel,2,n)
и аналогичные команды установки значений переменных простого типа.
Значения передаются непосредственно (не по ссылке) и доступны в кернеле сразу после установки параметра.
3. Запись исходные значений переменных структурных типов (массивов) в буфера указанные по хендлу h_CL_Buffers[],
для получения доступа к этим значениям из кернела: CLBufferWrite(h_CL_Buffers[0],x,0,0,n).
Для простых переменных такая запись не требуется.
4. Запуск выполнения кернела: CLExecute(h_CL_Kernel).
5. Считывание результатов расчета в массивы: CLBufferRead(h_CL_Buffers[0],x,0,0,n) - считывание n-элементов в массив x и др.
Завершающие операции.
Нужны для освобождения использованных кернел-программой ресурсов, после завершения программы или в случае ошибки на одном из этапов подготовки и выполнения.
Выполняются в обратном порядке к подготовительным операциям.
В данном примере все завершающие операции собраны в функции ShutDown():
Освобождение памяти буферов: CLBufferFree(i_CL_Buffers[i]).
Освобождение памяти кернела: CLKernelFree(i_CL_Kernel).
Освобождение ресурсов программы: CLProgramFree(i_CL_Program).
Освобождение ресурсов устройства (оборудования, контекста): CLContextFree(i_CL_Context).
Полезно для прочтения:
Overview about OpenCL and parallel processing
http://www.cmsoft.com.br/opencl-tutorial/overview-opencl-parallel-processing/
Основные положения и примеры программ занесены в публичный проект LibreOCL.
Вот допустим, у меня скрипт есть, который считает разные статистические параметры на каждом баре относительно МА и +-пункты , при этом значения MA перебираются, по идеи это можно запараллелить, может что-то подобное покажите как сделать?
Вот допустим, у меня скрипт есть, который считает разные статистические параметры на каждом баре относительно МА и +-пункты , при этом значения MA перебираются, по идеи это можно запараллелить, может что-то подобное покажите как сделать?
Посмотрите в каталог примеров OpenCL:
Посмотрите в каталог примеров OpenCL:
Какой конкретно пример посмотреть, или это в целом предложение?
Просто как примеры посмотрите.
Возможно, что-то подойдет и вообще поймете в каком направлении двигаться.
Просто как примеры посмотрите.
Возможно, что-то подойдет и вообще поймете в каком направлении двигаться.
Спасибо.
Просто как примеры посмотрите.
Возможно, что-то подойдет и вообще поймете в каком направлении двигаться.
Почему функция CLGetInfoInteger(0,CL_DEVICE_COUNT) детектирует не все имеющиеся устройства OpenCL?
То есть графическая карта, которую видят все тестовые программы, начиная с одного из последних релизов в mql5 скрыта?
Выяснилось, что в тестере стратегий в режиме визуализации OpenCL работает только на центральном процессоре.
При старте терминала обнаруживаются 3 OpenCL устройства:
При запуске примитивного теста:
Получаем результат обнаружения OpenCL устройств в реалтайме:
То есть третье устройство не инициализируется (не создается контекст).
При запуске того же теста в тестере стратегий (режим визуализации):
То есть обнаруживается всего одно OpenCL устройство - центральный процессор.