/ / OpenCL обчислення заморожує екран - opencl, freeze

Обчислення OpenCL зависає на екрані - opencl, freeze

Як заголовок говорить, коли я запускаю свою OpenCL ядро весь екран припиняє перемальовувати (зображення, відображене на моніторі, залишається таким же, поки моя програма не буде виконана з розрахунками. Це справедливо навіть у тому випадку, якщо я від'єднаю його від ноутбука та підключую назад - завжди відображається одне і те ж зображення), і комп'ютер, схоже, не реагує на рухи миші - курсор залишається в тому самому положенні.

Я не впевнений, чому це відбувається. Чи може це бути помилкою в моїй програмі, чи це стандартна поведінка?

Під час пошуку в Google я знайшов це нитка на форумі AMD, і деякі люди припустили, що це нормально, оскільки GPU не може оновити екран, коли він зайнятий обчисленнями.

Якщо це правда, чи є ще спосіб обійти це?

Моє обчислення ядра може зайняти до декількох хвилин, і те, що мій комп'ютер практично непридатний протягом цілого, це дуже болісно.

EDIT1: це моя поточна установка:

  • відеокарта - це ATI Mobility Radeon HD 5650 з 512 Мб пам'яті та найновішим бета-версією Catalyst з веб-сайту AMD
  • графіка перемикається - інтегрована карта інтегрована / інтегрована картами ATI, але Я відключив комутацію в BIOS, тому що в іншому випадку я не міг отримати драйвер, що працює на Ubuntu.
  • операційна система - Ubuntu 12.10 (64-біт), але це також відбувається в Windows 7 (64-біт).
  • У мене підключений монітор через HDMI (але екран ноутбука замерзає теж, тож це не повинно бути проблемою)

EDIT2: тому після дня гри зі своїм кодом я взяв поради з ваших відповідей і змінив свій алгоритм на щось подібне (у псевдокоді):

for (cl_ulong chunk = 0; chunk < num_chunks; chunk += chunk_size)
{
/* set kernel arguments that are different for each chunk */
clSetKernelArg(/* ... */);

/* schedule kernel for next execution */
clEnqueueNDRangeKernel(cmd_queue, kernel, 1, NULL, &global_work_size, NULL, 0, NULL, NULL);

/* read out the results from kernel and append them to output array on host */
clEnqueueReadBuffer(cmd_queue, of_buf, CL_TRUE, 0, chunk_size, output + chunk, 0, NULL, NULL);
}

Тож тепер я розділив усе навантаження на хост івідправте його до GPU шматками. Для кожного фрагмента даних я додаю нове ядро, а результати, які я отримую від нього, додаються до вихідного масиву при правильному зміщенні.

Це, як ви мали на увазі, що розрахунок слід розділити?

Це здається способом виправлення заморозкиПроблема, і навіть більше, зараз я можу обробляти дані набагато більше, ніж наявна пам'ять графічного процесора, але мені ще доведеться зробити хороші вимірювання продуктивності, щоб побачити, який хороший розмір шматка ...

Відповіді:

5 за відповідь № 1

Кожного разу, коли GPU працює ядро ​​OpenCL, воно єповністю присвячений OpenCL. Деякі сучасні графічні процесори Nvidia є винятком, я думаю, що з серії GeForce GTX 500 далі, які можуть запускати кілька ядер, якби ці ядра не використовували всі доступні обчислювальні одиниці.

Ваші рішення - розділити свої розрахункина декілька коротких викликів ядра, що є найкращим всебічним рішенням, оскільки воно буде працювати навіть на одних машинах GPU або інвестувати в дешевий графічний процесор для управління дисплеєм.

Якщо ви збираєтеся запускати довгі ядра на своїх графічних процесорахтоді ви повинні відключити виявлення та відновлення тайм-аут для графічних процесорів або зробити затримку таймауту довшою, ніж максимальна тривалість ядра (краще, оскільки помилки все-таки можуть бути зловлені), див. тут як це зробити.


2 для відповіді № 2

Кожен раз, коли я мав заморожувати дисплей або"Драйвер дисплея перестав реагувати і відновив" це "через помилку. Він може заморозити всю систему, і єдине, що я можу зробити, це скинути. Натомість зараз я розвиваюсь на процесорі спочатку. Це ніколи не руйнує всю мою систему Простіше налагоджувати цей спосіб також, оскільки я можу використовувати printf. Як тільки я отримав свій код робочої помилки безкоштовно на процесорі, я спробую його на GPU.


1 для відповіді № 3

Я новачок у opencl і зіткнувся з подібнимпроблема. Я виявив, що короткий розрахунок працює добре, але довший заморожує курсор миші. Для моєї проблеми Windows залишає жовтий трикутник в області лотка і поміщає в журнал подій повідомлення про "Драйвер дисплея перестав відповідати і відновився". Я знайшов рішення - розбити обчислення на невеликі частини, що займають не більше пари секунд кожна. Вони бігають спиною до спини, але, мабуть, дозволяють драйверу відео достатньо, щоб він був щасливим. Якщо я встановив global_work_size на значення, досить високе для максимальної пропускної здатності, відеовідповідь болісно повільна, але проблема з перезапуском драйвера / замиканням миші ніколи не виникає.