CUDA: Какие могут быть причины для того, чтобы nvcc потратил несколько минут на компиляцию? - PullRequest
1 голос
/ 22 октября 2009

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

Задержка между обновлениями версий 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, если это поможет.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 23 ноября 2009

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

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 голосов
/ 26 ноября 2009

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

0 голосов
/ 20 ноября 2009

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

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

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

...