Thrust::Sort非常长的编译时间

3
我正在尝试编译使用Thrust的示例代码,以帮助学习一些CUDA相关知识。
我使用Visual Studio 2010,并已经成功编译了其他示例。然而,当我编译这个示例时,需要花费超过10分钟的时间。我选择性地注释了一些代码行并发现是Thrust::sort这行代码需要很长时间(如果注释掉这一行,则只需要约5秒钟来编译)。
我在某个帖子中发现了有关Thrust中sort编译速度慢的讨论,这是Thrust开发团队做出的决定(运行时速度提高了3倍,但编译时间更长)。但那篇文章是在2008年末发布的。
你有任何想法为什么会这么慢吗?
此外,我正在使用以下配置的计算机进行编译,因此不是一台慢速计算机:
i7-2600k @ 4.5 ghz
16 GB DDR3 @ 1833 mhz
Raid 0 of 6 GB/s 1TB drives
如请求所示,这是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;
}

似乎Thrust的sort_by_key也有一个类似的已知问题,尽管我个人不记得它花费那么多时间进行排序。也许通知他们这些极端情况可能会有所帮助?但如果这是编译器问题,他们可能无能为力。 - Bart
它确实需要很长时间,但10分钟似乎有点太长了。你能把你正在使用的编译选项发出来吗? - Pavan Yalamanchili
我现在不在电脑旁,但我刚刚通过Visual Studio使用了默认设置。我刚刚安装了Nvidia CUDA SDK和工具包,安装了VC90编译器(VS2008 express版),从Nvidia网站的Thrust示例中复制了代码并尝试编译它。稍后我会发布确切的编译器标志。 - Veaviticus
没有回答?!好吧,我在使用thrust时也遇到了长时间的编译时间。我使用的是Ubuntu和CUDA 4.0。 - Nils
在我的2GHz、4GB、Q6600、Windows 7机器上,使用CUDA 4.1编译一个包含thrust::sort的程序需要一分钟左右。你可以将Thrust头文件移入预编译头文件中,或者将整个排序函数放入单独的.cu文件中。 - Roger Dahl
1个回答

2

CUDA 3.2版本中的编译器未经过针对像sort这样长且复杂的程序在调试模式下(即nvcc -G0)编译进行优化。在这种情况下,您会发现CUDA 4.0要快得多。同时,删除-G0选项也应该显著减少编译时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接