1

nvcc私は(技術的ptxasには)コンパイルに10分以上かかるのが好きなCUDAコードをいくつか持っています。小さくはありませんが、確かに大きくはありません。(〜5000行)。

CUDAバージョンの更新の間に遅延が発生するようですが、以前は10分ではなく1分程度しかかかりませんでした。

このオプションを使用-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"

カーネルにはかなり大きなパラメーターリストがあり、ポインターの数が多い構造体が渡されますが、まったく同じコードがわずか数秒でコンパイルされた時点が少なくとも1つあったことは知っています。

役立つ場合は、64ビットのUbuntu9.04を実行しています。

何か案は?

4

3 に答える 3

2

同様の問題がありました-最適化なしでは、コンパイルがレジスター不足で失敗し、最適化では30分近くかかりました。私のカーネルには次のような式がありました

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

コンパイル時間とレジスタの使用量が大幅に削減されました。

于 2009-11-23T10:27:07.220 に答える
0

関数に渡すことができるパラメータリストのサイズには制限があり、現在は256バイトであることに注意してください(CUDAプログラミングガイドのセクションB.1.4を参照)。機能はまったく変わりましたか?

カーネルごとに200万のPTX命令の制限もありますが、それに近づくべきではありません;-)

使用しているツールキットのバージョンは何ですか?3.0ベータ版は、メジャーアップデートである登録開発者の場合に利用できます。それでも問題が解決しない場合は、NVIDIAに連絡する必要があります。もちろん、NVIDIAは問題を再現できる必要があります。

于 2009-11-20T15:24:28.220 に答える
0

コンパイル行に設定-maxrregcount 64すると、レジスタアロケータが以前にlmemにスピルするため、役立ちます。

于 2009-11-26T18:17:11.907 に答える