最近在对CUDA程序进行简单调试时,觉得可以尝试一下printf函数,来打印中间过程结果,以此辅助检查程序的正确性,这个是最初的想法。
CUDA3.2当中引入的printf函数其实和ANSI C当中的printf相似,但是我感觉功能要弱不少。
1,关于参数,在我的机器上(GTX460)一次打印超过4个参数时,就会报错,例如打印
printf("%d , %d , %d , %d , %d\n",var1,var2,var3,var4,var5);
去查手册,记不大清楚自己曾在哪里看到的printf,姑且留个疑问,//TODO
2, 就是打印内容和host主机下打印结果不一致,这个很是恼人,开始我以为是程序逻辑出了错,翻来覆去写附属代码验证,后来将结果从显存倒腾至主存时,打印结果标明一切操作正常~~~~~泪奔。。。。要么是自己学艺不精,对于CUDA的printf实现需要深入学习,要么是NVIDIA的printf急需实现完整支持。。。要是后一种,那就是坑爹捏。。。。不过CUDA4已经出来,准备去查查看,应该是自己的问题。。这里也姑且留个疑问,//TODO
3, 还是关于CUDA循环,我发现在二级循环下访存,总是会报错,神马Unspecified Launch Failure,
例如,
if(threadIdx.x == 0){
for(int y=0; y<host_table_infos.state_number; y++){
for(int x=0; x<1; x++){
state2 tmp_state_set = device_nfa_stt_16b_global[y*256+x];
printf("%2hd,%2hd ",tmp_state_set.state_1,tmp_state_set.state_2);
}
printf("\n");
}
}
__syncthreads();
当外层循环次数超过1次时(即host_table_infos.state_number > 1),打印结果开始错乱,大量陌生数字蹦出。。。甚是无语。。
好吧,调整让外层就跑一次,内层循环次数超过1时,此时开始报错,伟大的unspecified launch failure。。。。现在还不确定错误原因, 待 吾 查查 手册 ~~~~
: TODO
这个问题大概是因为,cuda中的printf,他只有在几个特定时刻才会清空缓冲区,即flush,唯有此时才能输出,由于该时刻与CPU下的机制有些区别,因此,实际的输出会与自己的预期有差距。。。