? ?目前實驗室正在做并行計算躬厌,主要用的語言是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模式下進行了優(yōu)化,cuda為了加快速度橘蜜,會把加法和乘法合成菊匿。此時計算結果會有輕微的變化,導致浮點運算release模式運算結果有偏差计福。由于我們的項目對浮點運算的結果要求高跌捆,因此可以關閉。
參考:Visual Studio debug模式和release模式 CUDA 結果不同的解決_VincentCHOW的博客-CSDN博客