Многозадачность Windows нарушает производительность OpenCL - PullRequest
2 голосов
/ 01 марта 2012

Я пишу приложение Qt с простой идеей: есть несколько устройств с поддержкой OpenCL, каждое из которых получает собственный управляющий поток, который подготавливает данные, выполняет ядро ​​OpenCL и обрабатывает результаты.Код OpenCL на самом деле является ядром майнинга биткойнов (сейчас это , это , но это не имеет значения).

При работе с 2 графическими процессорами все в порядке.Когда я использую GPU и CPU, возникает проблема.Процессор работает с разумной скоростью, но производительность графического процессора замедляется до нуля.

В Linux нет такой проблемы.В Windows poclbm ведет себя одинаково: при запуске нескольких экземпляров (1 для GPU, 1 для CPU) производительность GPU равна 0.

Я не уверен, какую часть кода я должен публиковать, поэтомуэто будет полезно.Я могу только упомянуть, что нить является дочерним элементом QThread с run(), переопределенным с занятым циклом while( !_stop ) { mineBitcoins(); }.Логика этого цикла в значительной степени скопирована из poclbm BitcoinMiner::mining_thread ( здесь ).

В каком направлении мне копать?Спасибо.

upd: я использую QtOpenCL с AMD APP SDK .

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Если вы запускаете ядро ​​на ЦП с полным использованием всех ядер, потоки, которые обрабатывают другие устройства, могут не справиться с графическим процессором, эффективно ограничивая производительность.

Попробуйте уменьшить числопотоков, выполняющих ядро ​​на процессоре, например, если ваша программа работает на четырехъядерном процессоре с гиперпоточностью, ограничьте количество потоков до 7.

1 голос
/ 01 марта 2012

не используйте хост-устройство в качестве устройства opencl.Если у вас это действительно так, ограничьте количество вычислительных блоков (ЦП, используемых в качестве хоста), выделенных для CL, путем создания вспомогательного устройства.

0 голосов
/ 05 марта 2012

Я не знаю, используете ли вы оба устройства в одном контексте.Но если это так, то проблема может заключаться в согласованности памяти внутри контекста и в том, как с этим справляются различные реализации OpenCL.

OpenCL пытается поддерживать память в обновленном контексте (по крайней мере, в Windows), иможет заставить GPU непрерывно копировать использованную память обратно на «сторону процессора».

Я пытался это сделать очень давно, и в результате, как и в вашем случае, «~ = 0 производительность в GPU».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...