fxsaber #: Почему второй вариант работает в 20 раз медленнее?
Трюк с memcpy(Array, Array, 0) для получения адреса — остроумный хак, но использовать его для поэлементного доступа к массиву — антипаттерн. DLL-вызовы имеют смысл только для batch-операций, где один вызов обрабатывает большой блок данных.
Если нужен низкоуровневый доступ к памяти в MQL5, лучше писать всю логику внутри одной DLL-функции, а не дёргать её миллионы раз из MQL.
Причина очевидна: overhead вызова DLL-функции на каждой итерации.
Это подтверждает, что компилятор MQL5 умнее, чем кажется. Судя по всему компилятор видит 8 разных индексов, 8 отдельных проверок границ на каждой итерации и в результате потеря автовекторизации (не распознаёт паттерн). 0.3 нс на итерацию - думаю это почти предел. Даже C++ DLL не даст большого выигрыша. Практически уперлись в пропускную способность памяти, а не CPU. Дальше только менять архитектуру решения. Возможно использование GPU (OpenCL) даст какие-то результаты, но это только в случае, если присутствуют многократные операции над одним буфером или более сложные вычисления чем просто сумма. Для однократной суммы — GPU может быть сопоставим или даже медленнее из-за transfer overhead.
Nikolai Semko #: Возможно использование GPU (OpenCL) даст какие-то результаты, но это только в случае, если присутствуют многократные операции над одним буфером или более сложные вычисления чем просто сумма. Для однократной суммы — GPU может быть сопоставим или даже медленнее из-за transfer overhead.
ради любопытства сгенерил с помощью AI ассистента код теста с использованием OpenCL
Важно понимать что это результат на очень слабой интегрированной ноутбучной видео карте c shared с ОЗУ памятью Intel Iris Xe Graphics. Если поставить видеокарту примерно за 500 баксов (например NVIDIA RTX 4070), то скорость загрузки в память GPU увеличится в 4-5 раз, а скорость вычислений примерно в 10 раз в сравнении с моей картой.
Ожидаемые результаты на RTX 4070
Метрика
Iris Xe
RTX 4070
Разница
GPU load (400 MB)
110 мс
~25 мс*
4x
GPU compute (simple)
26 мс
~2-3 мс
10x
GPU compute (heavy)
28 мс
~2-3 мс
10x
Memory bandwidth
~3.6 GB/s
~15-20 GB/s**
5x
*PCIe 4.0 x16 = ~25 GB/s теоретический **Реальный через PCIe, не VRAM bandwidth
Интересно будет посмотреть результат этого теста для продвинутых видеокарт. Если есть у кого, покажите результат плиз.
PS Второй тест загрузки массива в GPU всегда быстрее из-за кэшa L3, в котором оказывается наш массив. Особенно заметно при размере массива меньше размера L3 кеша.
Поставил AMD APP SDK 3.0, терминал пишет opencl.dll not found, please install OpenCL drivers. Процессоры больше не поддерживаются? Сторонняя программа видит и рабает.
Nikolai Semko #: потеря автовекторизации (не распознаёт паттерн)
Почему второй вариант работает в 20 раз медленнее?
@amrali, @Nikolai Semko, спасибо!
Я хотел реализовать прямой доступ к массиву без проверок на корректность индекса.
@amrali, @Nikolai Semko, спасибо!
Я хотел реализовать прямой доступ к массиву без проверок на корректность индекса.
Этот вариант в три раза медленнее.
Этот вариант в три раза медленнее.
Судя по всему компилятор видит 8 разных индексов, 8 отдельных проверок границ на каждой итерации и в результате потеря автовекторизации (не распознаёт паттерн).
0.3 нс на итерацию - думаю это почти предел. Даже C++ DLL не даст большого выигрыша. Практически уперлись в пропускную способность памяти, а не CPU.
Дальше только менять архитектуру решения. Возможно использование GPU (OpenCL) даст какие-то результаты, но это только в случае, если присутствуют многократные операции над одним буфером или более сложные вычисления чем просто сумма. Для однократной суммы — GPU может быть сопоставим или даже медленнее из-за transfer overhead.
Возможно использование GPU (OpenCL) даст какие-то результаты, но это только в случае, если присутствуют многократные операции над одним буфером или более сложные вычисления чем просто сумма. Для однократной суммы — GPU может быть сопоставим или даже медленнее из-за transfer overhead.
ради любопытства сгенерил с помощью AI ассистента код теста с использованием OpenCL
Важно понимать что это результат на очень слабой интегрированной ноутбучной видео карте c shared с ОЗУ памятью Intel Iris Xe Graphics.
Если поставить видеокарту примерно за 500 баксов (например NVIDIA RTX 4070), то скорость загрузки в память GPU увеличится в 4-5 раз, а скорость вычислений примерно в 10 раз в сравнении с моей картой.
Ожидаемые результаты на RTX 4070
*PCIe 4.0 x16 = ~25 GB/s теоретический
**Реальный через PCIe, не VRAM bandwidth
Интересно будет посмотреть результат этого теста для продвинутых видеокарт. Если есть у кого, покажите результат плиз.
PS Второй тест загрузки массива в GPU всегда быстрее из-за кэшa L3, в котором оказывается наш массив. Особенно заметно при размере массива меньше размера L3 кеша.
Лучший вариант - вся логика внутри C++ DLL
и OMP там включить
https://learn.microsoft.com/ru-ru/cpp/parallel/openmp/reference/openmp-directives?view=msvc-170
https://stackoverflow.com/questions/27056090/how-to-parallelize-this-array-sum-using-openmp
ради любопытства сгенерил с помощью AI ассистента код теста с использованием OpenCL
Сохранился диалог?
ЗЫ Получаю ERR_OPENCL_NOT_SUPPORTED.
Сохранился диалог?
ЗЫ Получаю ERR_OPENCL_NOT_SUPPORTED.
МТшные примеры работают? Возможно драйвера не стоят.
У меня такая проблема:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
OpenCL в трейдинге
Rorschach, 2024.11.13 20:37
Поставил AMD APP SDK 3.0, терминал пишет opencl.dll not found, please install OpenCL drivers. Процессоры больше не поддерживаются? Сторонняя программа видит и рабает.потеря автовекторизации (не распознаёт паттерн)
Это проблема https://www.mql5.com/ru/forum/495741/page2#comment_58102015