Как обеспечить быстродействие графического интерфейса при использовании OpenCL на графическом процессоре дисплея?

За относительно короткое время изучения OpenCL я часто вижу, как мое приложение приводит к тому, что пользовательский интерфейс операционной системы становится значительно менее отзывчивым (например, несколько секунд, чтобы окно отреагировало на перетаскивание). Я столкнулся с этой проблемой в Windows Vista и Mac OS X с графическими процессорами NVidia.

Что я могу сделать при использовании OpenCL на том же графическом процессоре, что и дисплей, чтобы гарантировать, что мое приложение не приведет к значительному ухудшению отклика пользовательского интерфейса, как это? Кроме того, можно ли это сделать без ненужных потерь производительности в моем приложении? (То есть, если пользователь не выполняет какую-либо задачу с интенсивным использованием пользовательского интерфейса, я не ожидаю, что мое приложение будет работать медленнее, чем сейчас.)

Я понимаю, что любые ответы будут очень специфичными для платформы (где платформа включает комбинацию ОС/ГП/драйвера).


person Community    schedule 04.05.2010    source источник
comment
Это окно вашего приложения, перетаскивание которого занимает несколько секунд, или это другое окно из другого приложения, на которое это влияет?   -  person K. Brafford    schedule 05.05.2010
comment
Это другие окна приложений (мое приложение просто основано на консоли).   -  person pauldoo    schedule 07.05.2010


Ответы (1)


Как описано в учебном пособии по OpenCL, эпизод 6 доктора Дэвида Гохары (начиная с 43:49), видеокарты нельзя упреждающее планирование в настоящее время. В результате использование одной и той же видеокарты как для интенсивного ядра OpenCL, так и для пользовательского интерфейса (или других операций с использованием графического процессора) приведет к неуклюжести или визуальному зависанию. До тех пор, пока видеокарты не получат упреждающую многозадачность (если вообще когда-либо), нет возможности делать именно то, что вы хотите, с помощью всего лишь одной видеокарты. Я вообще не верю, что это проблема конкретной платформы.

Однако эту проблему можно решить, разделив задачу на части. Учитывая относительную скорость любого доступного отдельного графического процессора (вам придется провести тестирование, чтобы найти правильную настройку), разделите свою проблему OpenCL, чтобы запустить ядро ​​несколько раз с различными частями входных данных, а затем объедините выходные данные. когда все наборы ядер завершены. Я бы порекомендовал создавать наборы ядер, выполнение которых занимает менее 100 миллисекунд (на данном графическом процессоре), чтобы задержка была если не незаметной, то не слишком раздражающей (значение 100 миллисекунд — это хорошее «эмпирическое правило» в соответствии с данный документ).

Основываясь на вашем комментарии о том, что ваша программа является приложением командной строки, я предполагаю, что ваше приложение будет запускаться только один раз в любой момент времени, а не будет постоянно работающим приложением с выводом в реальном времени, как многие демонстрации OpenCL. Мой приведенный выше ответ подходит только для непостоянных приложений, поскольку производительность в реальном времени по своей сути не ожидается. Однако, если ваше приложение должно быть непрерывным, единственным доступным в настоящее время решением является добавление второй, более простой графической карты, которая будет использоваться только для пользовательского интерфейса.

person Community    schedule 10.05.2010