• 关于CUDA 3.2 中的 printf 函数


    最近在对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下的机制有些区别,因此,实际的输出会与自己的预期有差距。。。

  • 相关阅读:
    彻底理解c++的隐式类型转换
    golang1.16新特性速览
    配置CLion管理Qt项目国际化支持
    一道有趣的golang排错题
    计算机视觉 / 二维空间中,如何判断点在不在某个封闭图形内?
    如何使用google搜索?
    shuffle实现 / 洗牌算法
    Linux 命令行界面下,好玩的东西
    LAB5 Shell、外存管理与操作
    LAB6 网络通信 、 网卡驱动
  • 原文地址:https://www.cnblogs.com/superniaoren/p/2078897.html
Copyright © 2020-2023  润新知