2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Проблема timeout при счете на GPU
Сообщение01.11.2014, 12:36 
Аватара пользователя


22/09/09

1907
Нужно считать на 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 
Аватара пользователя


31/12/13
148
Разбейте вычислительное ядро на маленькие части, которые выполняются быстрее TDR.
Второй вариант: использовать GPU, который не участвует в рендере рабочего стола.
Правка реестра должна помочь, вы что-то не так сделали, либо не ребутнулись. Но этот вариант не очень хорош.

 Профиль  
                  
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 16:55 
Аватара пользователя


22/09/09

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

 Профиль  
                  
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 17:49 
Аватара пользователя


31/12/13
148
bin
1) Если правильно разбивать, то работать будет с той же скоростью.
2) Воспользуйтесь третьим GPU.
4) TDR не связан с NVAPI.

 Профиль  
                  
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 18:11 
Аватара пользователя


22/09/09

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

 Профиль  
                  
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 18:33 
Аватара пользователя


31/12/13
148
bin
Приведите вычислительное ядро.
Наверняка там есть цикл, его и бейте.
Естественно без обмена host <-> GPU, так весь смысл теряется.

 Профиль  
                  
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 18:41 
Аватара пользователя


22/09/09

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

 Профиль  
                  
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 19:39 
Аватара пользователя


31/12/13
148
bin
Зачем отсылать промежуточные результаты на host, если их можно хранить на GPU?
Всё, что вы хотели знать о параллельной редукции, но боялись спросить: http://www.cudahandbook.com/uploads/Cha ... uction.pdf

 Профиль  
                  
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 20:59 
Аватара пользователя


22/09/09

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

 Профиль  
                  
 
 Re: Проблема timeout при счете на GPU
Сообщение01.11.2014, 21:17 
Аватара пользователя


31/12/13
148
Второе предложение из текста по ссылке, которую я кинул:
Цитата:
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 
Аватара пользователя


22/09/09

1907
Извините, но Вы выразились слишком обобщенно. Тот реализ, который у меня сейчас, отсылает массив из $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 
Аватара пользователя


31/12/13
148
bin
Исходный массив длиной $n$ разбивается на $m$ частей, так, чтобы параллельная редукция каждой части происходила за время заведомо меньшее, чем TDR. На каждом шаге имеете результат редукции всех предыдущих частей исходного массива. Этот промежуточный результат хранится в глобальной памяти GPU, где вы такое вычитали про сброс устройства для рендера? Т.е. между вызовами вычислительного ядра вы храните промежуточный результат в глобальной памяти устройства, каждый раз при вызове ядра подсовываете этот результат, от вызова к вызову его содержимое будет приближаться к ответу.

 Профиль  
                  
 
 Re: Проблема timeout при счете на GPU
Сообщение02.11.2014, 18:52 
Аватара пользователя


22/09/09

1907
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 
Аватара пользователя


31/12/13
148
bin
Подозреваю, что это не код вычислительного ядра, а код его обертки. После вычислений и выдачи результата ресетте свой девайс сколько душе угодно. Выполнение ядра имеет ограничение в 2 секунды, но не код, который вы привели, это обёртка.

 Профиль  
                  
 
 Re: Проблема timeout при счете на GPU
Сообщение02.11.2014, 20:06 
Аватара пользователя


22/09/09

1907
electric_retard
Да, это в main(). И вот какая-то компонента Windows, которая обновляет экран, каждые 2 сек. "резетет" устройство, где у меня хранится число. А моя программа на следующем шаге снова обращается к устройству. Будет ли там мое число?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group