2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2  След.
 
 Проблема timeout при счете на GPU
Сообщение01.11.2014, 12:36 
Аватара пользователя
Нужно считать на GPU сложную задачу (сложность $n!$) под 32-битной Wind XP SP3. Программа отлажена для малых $n$, но при увеличении $n$ выдает
Код:
the launch timed out and was terminated in ... at line ...
Микрософт рекомендует редакцию реестра
Код:
http://msdn.microsoft.com/en-us/Library/Windows/Hardware/ff569918(v=vs.85).aspx
(прошу извинить за такое оформление ссылки, но стандартное здесь почему-то не работает)

, но мне она не помогла. Кто знает, как решить эту проблему? Может тут помочь nvapi, например?

 
 
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 16:29 
Аватара пользователя
Разбейте вычислительное ядро на маленькие части, которые выполняются быстрее TDR.
Второй вариант: использовать GPU, который не участвует в рендере рабочего стола.
Правка реестра должна помочь, вы что-то не так сделали, либо не ребутнулись. Но этот вариант не очень хорош.

 
 
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 16:55 
Аватара пользователя
1) Разбивать опасаюсь: замедлится алгоритм, а цель показать на практике, что этот алгоритм хотя и трудно, но можно использовать. Хотел бы поставить задачу на всю ночь с выключенным монитором.
2) На мат.плате есть интегрированный GPU худшего качества. Но перекидывать кабель, каждый раз как придет идея по ускорению программы, будет трудозатратно, т.к. в другое время занимаюсь другими задачами, где желательно хорошее качество экранной графики.
3) Проделал несколько раз и не знаю, что тут можно сделать не так. Перезагружался. В сетке нашел подобную проблему, где правка реестра не помогла. Там помогла установка нового драйвера. Поставил новый - тоже самое.
4) А Вы с nvapi не работали? Может тут помочь nvapi?

 
 
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 17:49 
Аватара пользователя
bin
1) Если правильно разбивать, то работать будет с той же скоростью.
2) Воспользуйтесь третьим GPU.
4) TDR не связан с NVAPI.

 
 
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 18:11 
Аватара пользователя
electric_retard
1) Не знаю, как разбивать в моем случае. На выходе у меня одно число. Придется пересылать промежуточные результаты и пересылка займет время м.б. сравнимое с вычислением?
2) И третьим и тысячным. Но сейчас мне нужно понять, что игра стоит свеч. А покупать GPU для одной задачи не выглядит целесообразным.

 
 
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 18:33 
Аватара пользователя
bin
Приведите вычислительное ядро.
Наверняка там есть цикл, его и бейте.
Естественно без обмена host <-> GPU, так весь смысл теряется.

 
 
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 18:41 
Аватара пользователя
electric_retard в сообщении #925121 писал(а):
Естественно без обмена host <-> GPU, так весь смысл теряется.
Не понял. Как, нпр., найти минимальное из $n$ чисел без обмена?

 
 
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 19:39 
Аватара пользователя
bin
Зачем отсылать промежуточные результаты на host, если их можно хранить на GPU?
Всё, что вы хотели знать о параллельной редукции, но боялись спросить: http://www.cudahandbook.com/uploads/Cha ... uction.pdf

 
 
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 20:59 
Аватара пользователя
electric_retard
Я совсем недавно прочел книгу Сандерс и Кэндрот, Технология CUDA в примерах, где авторы подробно показывают редукцию на GPU, однако не понимаю, как может помочь этот прием в моей задаче. Упрощаю, откидывая незначительные детали. У меня на GPU в общей сложности $k$ нитей-потоков, как они распределены по блокам, мы сейчас не обсуждаем. Каждая нить получает с host некоторое целое число и, исходя из него, генерирует $m$ целых чисел. $km=n!$, понятно, что $k<<m$. Нужно выбрать из всех $n!$ чисел минимальное. Где здесь можно воспользоваться редукцией? (Я совсем недавно, примерно неделю назад, стал осваивать CUDA, поэтому что-то очевидное для Вас может быть неочевидным для меня.)

 
 
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 21:17 
Аватара пользователя
Второе предложение из текста по ссылке, которую я кинул:
Цитата:
Reduction is a class of parallel algorithms that pass over O(N) input data and generate a O(1) result computed with a binary associative operator . Examples of such operations include: minimum, maximum, sum, sum of squares, AND, OR, or the dot product of two vectors.

Т.е. поиск мин числа в массиве это и есть редукция. Ваш раздел 5.3 в Сандерсе.

 
 
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 22:40 
Аватара пользователя
Извините, но Вы выразились слишком обобщенно. Тот реализ, который у меня сейчас, отсылает массив из $k$ чисел в устройство и получает массив из $k$ минимальных значений, т.е. каждое из этих значений минимальное из найденных в каждой нити $m$ значений. (Можно выбрать и в устройстве самое минимальное из этих значений и отсылать на хост только одно - искомое). Вы,насколько я понял, предлагаете разбить $m$ на малые порции, обозначим размер каждой такой порции $p, tp=m$ и вызывать циклически устройство $t$ раз. Т.о. устройство на каждом шаге цикла должно получать $k$ параметров для очередной генерации, генерировать $p$ значений, выбирать минимум и отправлять на хост $k$ минимальных значений из всех $kp$. Либо выбирать минимальное из полученных $k$ значений и отправлять на хост только его. Либо хранить где-то до следующего шага цикла, вызывающего устройство. Насколько я понимаю, последний вариант отпадает, т.к. устройство после каждого шага будет сброшено для работы со столом. Получается, что нужно сделать $t$ обменов "хост-устройство" и $t$ обменов "устройство-хост", т.е. переслать не $2k$ чисел, как у меня сейчас, и не $k+1$ число, как можно сделать, а $2kt$ чисел. Либо каким-то чудесным образом восстанавливать минимум, полученный на предыдущем шаге. Каким образом сделать такое восстановление, я не представляю. Объясните, пожалуйста, подробнее.

(Если timeout = 2 сек., то при 10 часах работы $t=18000$).

 
 
 
 Re: Проблема timeout при счете на GPU
Сообщение02.11.2014, 15:18 
Аватара пользователя
bin
Исходный массив длиной $n$ разбивается на $m$ частей, так, чтобы параллельная редукция каждой части происходила за время заведомо меньшее, чем TDR. На каждом шаге имеете результат редукции всех предыдущих частей исходного массива. Этот промежуточный результат хранится в глобальной памяти GPU, где вы такое вычитали про сброс устройства для рендера? Т.е. между вызовами вычислительного ядра вы храните промежуточный результат в глобальной памяти устройства, каждый раз при вызове ядра подсовываете этот результат, от вызова к вызову его содержимое будет приближаться к ответу.

 
 
 
 Re: Проблема timeout при счете на GPU
Сообщение02.11.2014, 18:52 
Аватара пользователя
electric_retard
Начинает проясняться.
electric_retard в сообщении #925431 писал(а):
Этот промежуточный результат хранится в глобальной памяти GPU, где вы такое вычитали про сброс устройства для рендера?
Все (или почти все?) программы в CUDA Samples оканчиваются вызовом cudaDeviceReset. Например:
Используется синтаксис C
//File: ..\NVIDIA Corporation\CUDA Samples\v5.0\0_Simple\vectorAdd
/* Copyright 1993-2012 NVIDIA Corporation.
...
/* Vector addition: C = A + B.
...
// Reset the device and exit
    err = cudaDeviceReset();
    if (err != cudaSuccess)
    {
        fprintf(stderr, "Failed to deinitialize the device! error=%s\n", cudaGetErrorString(err));
        exit(EXIT_FAILURE);
    }
    printf("Done\n");
    return 0;
Поэтому встречный вопрос: а где написано, что обновление стола не сотрет мою переменную в памяти GPU? Как лучше определить такую глобальную переменную?

 
 
 
 Re: Проблема timeout при счете на GPU
Сообщение02.11.2014, 19:21 
Аватара пользователя
bin
Подозреваю, что это не код вычислительного ядра, а код его обертки. После вычислений и выдачи результата ресетте свой девайс сколько душе угодно. Выполнение ядра имеет ограничение в 2 секунды, но не код, который вы привели, это обёртка.

 
 
 
 Re: Проблема timeout при счете на GPU
Сообщение02.11.2014, 20:06 
Аватара пользователя
electric_retard
Да, это в main(). И вот какая-то компонента Windows, которая обновляет экран, каждые 2 сек. "резетет" устройство, где у меня хранится число. А моя программа на следующем шаге снова обращается к устройству. Будет ли там мое число?

 
 
 [ Сообщений: 28 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group