目前实验室正在做并行计算,主要用的语言是cuda。由于c++基础薄弱,cuda也算是接触了一年左右,在做这个项目的时候经常会遇到一些链接、语法、配置等等问题,记录一下已备后用。
之前遇到的问题有些已经不记得了,后面再遇到问题再补充。
1.模板使用错误
首先是文件介绍,这里涉及到三个文件,invoker.h,invoker.cpp,processes.cpp,invoker.h中是个命名空间,命名空间中的函数使用模板定义,在invoker.cpp中实现,processes.cpp中调用。由于模板的声明和实现不能分离,因此需要在processess.cpp中加入头文件#include"invoker.h" #include"invoker.cpp“,用图片来表示。
2.extern/static定义的变量
头文件中定义变量 static int a;在源文件中赋值 int a = 1;在整个项目中的文件只要添加头文件就可以使用变量a。
3.debug error错误
之前用的vs2017,由于换电脑又下载了vs2019,把2017上的项目迁移到2019上后,编译成功,在release模式下可以正常运行,debug模式下运行出现了debug error错误,说result没有被初始化,具体报错如下。
解决方法:项目属性->c/c++->代码生成-->基本运行时检查-->默认值
原因:当使用默认值时,程序可以运行,结果为相对应位置的值。例如本程序中结果为48,若程序Fun1()函数中只有一个变量,值为多少,结果就为多少。说白了,函数Fun2()中变量a的值与其本身无关,而与相对应的内存中存放的值有关。原因是默认值这种模式,当有新的栈帧开辟时,不会有0xcc这个初始化的过程。
https://blog.csdn.net/weixin_44171004/article/details/86675605
4.debug和release模式下结果不一致,误差很大
解决方法:1.有些变量没有初始化
2.有些计算在release模式下进行了优化,cuda为了加快速度,会把加法和乘法合成。此时计算结果会有轻微的变化,导致浮点运算release模式运算结果有偏差。由于我们的项目对浮点运算的结果要求高,因此可以关闭。
参考:Visual Studio debug模式和release模式 CUDA 结果不同的解决_VincentCHOW的博客-CSDN博客