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

  • 相关阅读:
    互联网搜索引擎——文本预处理
    nltk的pos_tag
    nltk.stem 词干提取(stemming)
    python3的encode和decode涉及的str和bytes转换
    power rails 'GND' and 'VCC/VDD' are interconnected in net VCC
    impot不能导入自己写的python文件【爆红】
    No module named 'tensorflow.contrib'
    解决spark-submit的There is insufficient memory for the Java Runtime Environment to continue.(老顽固问题) failed; error='Cannot allocate memory' (errno=12)
    spark的standalone模式下:查看任务结束后的历史记录
    只是为了保存一些有用链接而已
  • 原文地址:https://www.cnblogs.com/superniaoren/p/2078897.html
Copyright © 2020-2023  润新知