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

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

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

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

1 Ответ

17 голосов
/ 10 мая 2010

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

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

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

...