2009-10-21 10 views
1

У меня есть код CUDA, который nvcc (ну, технически ptxas) любит собирать более 10 минут для компиляции. Хотя он не маленький, он, конечно, не огромен. (~ 5000 строк).CUDA: Какие могут быть причины для nvcc за несколько минут для компиляции?

Задержка, кажется, приходят и уходят от CUDA обновления версий, но ранее он только взял минуту или так вместо 10.

Когда я использовал вариант -v, он, казалось, застревают после показа следующим образом:

ptxas --key="09ae2a85bb2d44b6" -arch=sm_13 "/tmp/tmpxft_00002ab1_00000000-2_trip3dgpu_kernel.ptx" -o "/tmp/tmpxft_00002ab1_00000000-9_trip3dgpu_kernel.sm_13.cubin" 

ядро ​​имеет довольно большой список параметров и структуру с хорошим количеством указателей прошло вокруг, но я знаю, что есть по крайней мере один момент времени, в котором почти точно такой же код составленный всего за пару секунд.

Я использую 64-разрядный Ubuntu 9.04, если это помогает.

Любые идеи?

+0

возможно ошибка в компиляторе? компилятор использует много памяти и заставляет систему трэш? –

+0

Учитывая природу проблемы, я не удивлюсь. Тем более, что когда я компилирую с помощью -device-emulation, она быстро компилируется. Конечно, даже если это ошибка в компиляторе, мне все равно хотелось бы что-нибудь сделать. – rck

+0

Что произойдет, если отключить оптимизацию? –

ответ

0

Следует отметить, что существует ограничение на размер списка параметров, который может быть передан функции, в настоящее время 256 байт (см. Раздел B.1.4 Руководства по программированию CUDA). Изменена ли вообще функция?

Существует также предел 2 млн PTX инструкций на ядро, но вы не должны быть приближаетесь к ;-)

Какой версии набора инструментов вы используете? Бета-версия 3.0 доступна, если вы являетесь зарегистрированным разработчиком, который является основным обновлением. Если у вас все еще есть проблема, вы должны обратиться в NVIDIA, они должны будут иметь возможность воспроизвести проблему, конечно.

+0

Я знаю об ограничении параметров, я столкнулся с этой проблемой раньше. (И досадно, я не могу обойти это, просто используя структуры). Однако мне непонятно, является ли это фактором замедления. – rck

2

У меня была схожая проблема - без оптимизации, компиляция не закончилась с регистрами, а с оптимизацией потребовалось почти полчаса. Мои ядра были такие выражения, как

t1itern[II(i,j)] = (1.0 - overr) * t1itero[II(i,j)] + overr * (rhs[IJ(i-1,j-1)].rhs1 - abiter[IJ(i-1,j-1)].as * t1itern[II(i,j - 1)] - abiter[IJ(i-1,j-1)].ase * t1itero[II(i + 1,j - 1)] - abiter[IJ(i-1,j-1)].ae * t1itern[II(i + 1,j)] - abiter[IJ(i-1,j-1)].ane * t1itero[II(i + 1,j + 1)] - abiter[IJ(i-1,j-1)].an * t1itern[II(i,j + 1)] - abiter[IJ(i-1,j-1)].anw * t1itero[II(i - 1,j + 1)] - abiter[IJ(i-1,j-1)].aw * t1itern[II(i - 1,j)] - abiter[IJ(i-1,j-1)].asw * t1itero[II(i - 1,j - 1)] - rhs[IJ(i-1,j-1)].aads * t2itern[II(i,j - 1)] - rhs[IJ(i-1,j-1)].aadn * t2itern[II(i,j + 1)] - rhs[IJ(i-1,j-1)].aade * t2itern[II(i + 1,j)] - rhs[IJ(i-1,j-1)].aadw * t2itern[II(i - 1,j)] - rhs[IJ(i-1,j-1)].aadc * t2itero[II(i,j)])/abiter[IJ(i-1,j-1)].ac; 

и когда я переписал их:

tt1 = lrhs.rhs1; 
tt1 = tt1 - labiter.as * t1itern[II(1,j - 1)]; 
tt1 = tt1 - labiter.ase * t1itern[II(2,j - 1)]; 
tt1 = tt1 - labiter.ae * t1itern[II(2,j)]; 
//etc 

это значительно сокращает время компиляции и зарегистрировать использование.

+0

Интересно. Когда вы переписали их, это все равно потерпело неудачу без оптимизации? То есть, вы переписывали его так, как будто это было достаточно намека на то, что только оптимизатор может сохранять регистры или может быть основным компилятором? – rck

+0

Это помогло даже без оптимизации. Похоже, что nvcc имеет проблемы с основным компилятором, а проблема оптимизатора - это просто следствие – 2009-11-25 17:27:32

0

Установка -maxrregcount 64 на линии компиляции помогает, так как он вызывает регистр Распределитель проливать на lmem ранее