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

  • 相关阅读:
    SPOJ LCS2
    SPOJ NSUBSTR
    1977: [BeiJing2010组队]次小生成树 Tree
    2002: [Hnoi2010]Bounce 弹飞绵羊
    P3690 【模板】Link Cut Tree (动态树)
    P2093 [国家集训队]JZPFAR
    2648: SJY摆棋子
    HDU 2966 In case of failure
    bzoj 一些题目汇总
    BZOJ3653谈笑风生——可持久化线段树+dfs序
  • 原文地址:https://www.cnblogs.com/superniaoren/p/2078897.html
Copyright © 2011-2022 走看看