2013-08-09 6 views
0

Я использую карту Quadro K2000M, возможность CUDA 3.0, CUDA Driver 5.5, runtime 5.0, программирование с Visual Studio 2010. Мой алгоритм GPU выполняет много параллельных поисков ширины (BFS) дерева (константа). Потоки независимы, за исключением чтения из постоянного массива и дерева. В каждом потоке могут быть некоторые операции malloc/free, следуя алгоритму BFS с очередями (без рекурсии). Там N потоков; число узлов дерева листьев также N. Я использовал 256 потоков на блок и (N + 256-1)/256 блоков на сетку.Как отлаживать: ядро ​​CUDA терпит неудачу, когда есть много потоков?

В настоящее время проблема заключается в том, что программа работает для менее N = 100000 потоков, но не работает более чем. Он также работает в процессоре или в потоке GPU по потоку. Когда N велико (например,> 100000), ядро ​​падает, а затем cudaMemcpy с устройства на хост также терпит неудачу. Я пробовал Nsight, но он слишком медленный.

Теперь я установил cudaDeviceSetLimit(cudaLimitMallocHeapSize, 268435456); Я также пробовал более крупные значения, до 1G; cudaDeviceSetLimit преуспел, но проблема остается.

Кто-нибудь знает какую-то общую причину вышеуказанной проблемы? Или любые подсказки для дальнейшей отладки? Я попытался поставить некоторые printf, но есть тонны вывода. Более того, как только поток падает, все остальные printf отбрасываются. Таким образом, трудно определить проблему.

+0

Вы бы хотели поделиться своим проектом VS2010? Я только начинаю с CUDA и интересуюсь сетевым анализом. Заранее спасибо. – ProfNimrod

ответ

1

«CUDA Driver 5.5, runtime 5.0» - это кажется странным.

Возможно, вы столкнулись с windows TDR event. Основываясь на вашем описании, я бы это сделал первым. Если по мере того, как вы увеличиваете потоки, ядро ​​начинает выполнять более 2 секунд для выполнения, вы можете поразить время ожидания Windows.

Вы также должны добавить свой код cuda error checking в код, для всех вызовов ядра и вызовов API CUDA. Событие TDR в Windows будет легче проявляться на основе кодов ошибок, которые вы получаете. Или коды ошибок могут управлять вами в другом направлении.

Наконец, я бы запустил ваш код с cuda-memcheck как в проходе, так и в случае сбоев, ища внеочередные обращения в ядре или другие проблемы.

+0

Спасибо, Роберт. Мое ядро ​​работает слишком долго. Он работает после отключения TDR WDDM. – rozyang

Смежные вопросы