3

CUDA の学習を支援するために、Thrust を使用してサンプル コードのブロックをコンパイルしようとしています。

私は Visual Studio 2010 を使用しており、コンパイルする他の例を入手しました。ただし、この例をコンパイルすると、コンパイルに 10 分以上かかります。行を選択的にコメントアウトし、その Thrust::sort 行が永遠にかかることを理解しました (その 1 行をコメントアウトすると、コンパイルに約 5 秒かかります)。

Thrust での sort のコンパイルがどのように遅いかについて話している投稿をどこかで見つけました。これは Thrust 開発チームが下した決定でした (実行時は 3 倍高速ですが、コンパイルには時間がかかります)。しかし、その投稿は2008年後半のことです。

なぜこれに時間がかかるのですか?

また、私は次のスペックのマシンでコンパイルしているので、遅いマシンではありません

i7-2600k @ 4.5 GHz
16 GB DDR3 @ 1833 MHz
Raid 0 of 6 GB/s 1TB ドライブ

要求どおり、これは Visual Studio が呼び出しているように見えるビルド文字列です

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v3.2\bin\nvcc.exe" -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin" -I"C:\ Program Files\NVIDIA GPU Computing Toolkit\CUDA\v3.2\include" -G0 --keep-dir "Debug\" -maxrregcount=32 --machine 64 --compile -D_NEXUS_DEBUG -g -Xcompiler "/EHsc /nologo / Od /Zi /MTd " -o "Debug\kernel.obj" "C:\Users\Rob\Desktop\VS2010Test\VS2010Test\VS2010Test\kernel.cpp" -clean

#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/sort.h>
int main(void)
{
    // generate 16M random numbers on the host
    thrust::host_vector<int> h_vec(1 << 24);
    thrust::generate(h_vec.begin(), h_vec.end(), rand);
    // transfer data to the device
    thrust::device_vector<int> d_vec = h_vec;
    // sort data on the device
    thrust::sort(d_vec.begin(), d_vec.end());
    // transfer data back to host
    thrust::copy(d_vec.begin(), d_vec.end(), h_vec.begin());
    return 0;
}
4

1 に答える 1

1

sortCUDA 3.2 のコンパイラは、デバッグ モード (つまり ) を使用するなど、長くて複雑なプログラムをコンパイルするために最適化されていませんでしたnvcc -G0。この場合、CUDA 4.0 の方がはるかに高速であることがわかります。オプションを削除すると、-G0コンパイル時間も大幅に短縮されます。

于 2011-06-15T14:57:27.343 に答える