NVIDIA Cuda if 语句 [关闭]

Posted

技术标签:

【中文标题】NVIDIA Cuda if 语句 [关闭]【英文标题】:NVIDIA Cuda if-statement [closed] 【发布时间】:2017-05-24 03:05:32 【问题描述】:

我有一个非常奇怪的错误。我正在 Cuda 中编写一个模拟康威生命游戏的程序。我将二维数组传输到设备,并且有一个 if-case 检查状态线程。

if(iam==-1)
       //i am on
    iam=0;

else if(iam==1)
       //i am dying
    iam=-1;

else    //i am off

        if(counter_alive==2)//two neighboors alive
        
            iam=1;  //i will be on
        
        //  iam = -999;

当最后一行在注释中时,没有任何作用,并且 var "iam" 具有第一个值。但是,如果我放弃 //,它将起作用。当然,如果流程的代码执行 else,var "iam" 将取值 -999。 有任何想法吗?我错过了什么吗? 提前致谢!

【问题讨论】:

@talonmies:你怎么知道这个问题与 C 或 C++ 无关?就目前而言,我宁愿怀疑它确实如此,但可能根本与 CUDA 没有任何联系。 :) @tera:因为它只是标签垃圾邮件,这就是原因。而且我宁愿只是悄悄地删除标签,而不是让一个通常的 C 或 C++ 愤怒的巨魔来删除它并同时开始一场激烈的战争 嗯,好的。请注意,无论如何,这都是开玩笑的。 @fikos:你真的需要提供一个Minimal, Complete, and Verifiable example。 阅读 cmets 让我觉得您正在调试某些调试器(例如 NVSight)中的 CUDA 代码,对吗?您实际上是在调试模式下编译它并且没有优化吗?那将是-G。没有它,调试器可能会有点丢失并显示奇怪的结果。例如。 if 语句可以简化为谓词赋值。 【参考方案1】:

您没有显示变量 iam 或 counter_alive 的初始值。让我们假设编译器已经将它设置为0。当然即使编译器只是将空间设置为一个随机值,这个分析也是一样的。

if(iam==-1)
       //i am on
    iam=0;

由于初始值为0,则此失败并通过

else if(iam==1)
       //i am dying
    iam=-1;

同样,由于初始值为0,因此失败并通过。

else    //i am off

    if(counter_alive==2)//two neighboors alive
        
            iam=1;  //i will be on
        
    //  iam = -999;

这里输入的值为0。但是由于counter_alive从来没有设置过,所以也是0,if失败。

因此,iam 变量永远不会从 0 更改。请注意,由于两个临界值都不会更改,因此 iam 永远不会从 0 重置。如果取消注释最后一行,它将始终显式设置为 -999 并且将也永远不会改变。那是因为您从不测试 0 或 999。如果您将其设置为 -1,它将更改为 0,然后永远不会更改,除非您将其他地方的 counter_alive 更改为 2。

请注意,Explanation of CUDA C and C++ 解释了如何将循环处理为并行处理。在这种情况下,数组中各种项目的反应可能不是您在纯 C(单流)处理中所期望的。

【讨论】:

变量 iam 有 3 个值。 1 -1 或 0。让我们忘记 else 语句。我检查了值 -1,最后一行(iam = -999)是评论。从不进入第一个 if 语句。但如果我取消注释 iam = -999;它进入第一个 if。我知道这听起来很奇怪。如果你愿意,我可以发布截图。不知道是不是cuda线程的问题。 @fikos 我们将不得不查看与此相关的代码。什么是iam?它是 int、short、unsigned 吗?你怎么知道 iam 设置为 -1 并且没有被第一个 if 语句拾取?你是如何设置 counter_alive 的?

以上是关于NVIDIA Cuda if 语句 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 10 上更新 CUDA 驱动程序 nvidia? [关闭]

尝试同时使用板载 iGPU 和 Nvidia 独立卡时,CUDA 失败。我如何同时使用离散的 nvidia 和集成(板载)intel gpu? [关闭]

用于计算的 Nvidia 消费级 GPU [关闭]

怎么开启NVIDIA CUDA功能

如何查看自己的CUDA版本

c++ 程序是不是可以在 if/else 语句中包含 switch 语句[关闭]