Visual studio 2013中的c++和Cuda速度
C++ and Cuda speed in Visual studio 2013
我在VS 2013上运行数据挖掘算法。我已经实现了基于CPU的版本(使用。cpp文件)和基于GPU的版本(使用cuda 7.5 .cu文件)。
两个版本都按预期运行。CPU版本耗时约1500秒,GPU版本耗时约500秒。
然后我将这两个文件合并到一个.cu文件中,并使用标志控制运行哪个版本,我发现CPU版本在.cu文件中变得更快,所有其他参数和代码保持不变,只需要大约600秒。
然后我尝试在Empty c++项目和cuda项目中分别运行相同的c++代码(没有cuda),发现结果一致。cu版本需要600秒,cpp版本需要1500秒。
为什么会发生这种情况?这是来自不同的编译器或不同的初始环境VS项目?
nvcc
传递给宿主编译器的宿主代码通常不是程序员编写的.cu
文件的宿主部分的逐字副本。相反,nvcc
解析和预处理代码,并将语义上相同的代码发送给主机编译器(查看作为nvcc
编译轨迹的一部分生成的中间文件将揭示细节)。由于主机编译器代码生成中的工件,这可能导致主机代码在合并到.cu
文件中运行时,与.cpp
文件中的独立版本相比运行得更快或更慢。
通常,产生的性能差异非常小,在我的经验中高达10%左右。因此,这里报告的非常显著的性能差异要么是上述场景的极端异常值,要么(在我看来更有可能)是编译中的其他差异。
例如,不同的编译器选项,例如不同的优化级别,可以作为CUDA编译与独立编译的一部分传递给主机编译器。如果您在MSVS中启用了显示主机编译器调用细节的编译过程的详细日志,那么情况就会变得很明显。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- 在cuda线程之间共享大量常量数据
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 为什么在读取文件大小时文件IO速度会发生变化
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- CUDA内核和数学函数的显式命名空间
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- CUDA:统一内存和指针地址的更改
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 调试 CUDA MMU 故障
- 使用 CUDA 和纹理进行图像减法
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- CUDA 速度比预期慢 - 图像处理
- CUDA Shuffle指导减少速度慢于减少共享记忆
- 可以在CUDA速度计算中实现TensorFlow自定义OP梯度
- CUDA:最少的正方形解决,速度差
- 简单的Thrust代码的执行速度大约是我的cuda内核的一半.我用Thrust错了吗
- OpenCV CUDA运行速度比OpenCV CPU慢
- Visual studio 2013中的c++和Cuda速度