我在VS 2013上运行数据挖掘算法。 我已经实现了基于CPU的版本(带.cpp文件)和基于GPU的版本(使用cuda 7.5 .cu文件)。
两个版本都按预期运行。基于CPU的版本大约需要1500秒,GPU版本大约需要500秒。
然后我将这两个文件合并到单个.cu文件中,并控制使用标志运行哪个版本,我发现在.cu文件中CPU版本变得更快,所有其他参数和代码保持不变,只需要600秒。
然后我尝试在Empty C ++项目和CUDA项目中单独运行相同的c ++代码(不使用cuda)并发现结果一致。 cu版本需要600秒,而cpp需要1500秒。
为什么会这样?这是来自不同的编译器还是VS项目的不同初始环境?
答案 0 :(得分:2)
nvcc
传递给主机编译器的主机代码通常不是程序员编写的.cu
文件主机部分的逐字副本。相反,nvcc
解析并预处理代码并将语义相同的代码发送到主机编译器(查看作为nvcc
编译轨迹的一部分生成的中间文件将透露细节)。由于主机编译器代码生成中的工件,与.cu
文件中的独立版本相比,这可能导致主机代码在合并到.cpp
文件时运行得更快或更慢。
通常,由此产生的性能差异非常小,在我的经验中高达约10%。因此,这里报告的非常显着的不同性能差异要么是上面概述的场景的极端异常值,要么(更可能在我的opionion中)在编译中存在其他差异。
例如,不同的编译器选项,例如不同的优化级别,可以作为CUDA编译与独立编译的一部分传递给主机编译器。如果在MSVS中启用了编译过程的详细日志,该日志显示了主机编译器调用的详细信息,那么是否会出现这种情况应该很明显。