【问题标题】:What is a TRUE(240) boolean什么是 TRUE(240) 布尔值
【发布时间】:2016-03-29 11:17:02
【问题描述】:

我的一个内核比较一个双一维数组的每个值,验证是否大于一个标量。该内核填充比较结果的布尔数组。

生成的布尔向量应以 TRUE 或 FALSE 形式提供每个元素比较结果。

但我发现设备正在存储其他类型的 TRUE 值,这会导致我的代码崩溃。我可以找到 TRUE (63)、TRUE (66)、TRUE (240) 等。这是什么?

请在标量为零的情况下分两次下载同一个数组的图片。

https://onedrive.live.com/redir?resid=26B45E0F43F4667B!12766&authkey=!APVysjd1WK1nDhE&ithint=folder%2c

一维数组包含 100 个元素,只有第一个元素等于 1,其余的都等于 0。预期的结果当然是: {真,假,假,假,...假}

我发现另一个问题的答案建议使用 32 位整数(“理想情况下,您应该以使用 32 位类型为目标”),但我不明白该怎么做:

Boolean operations on CUDA

这是我的内核:

__global__ void _vecCmpGreat(bool *output, double *input1, double input2) {
    unsigned int i = blockDim.x * blockIdx.x + threadIdx.x;
    if (i < samples)
        output[i] = input1[i] > input2;
}

计算比较结果的代码部分如下。当在布尔数组中找到“FALSE”到“TRUE”的转换时,它应该推回 std::vector 结果。

unsigned int j;
for (unsigned int i = 0; i < samples - 1; i++) {
    j = samples - i - 1;
    if (r[samples - 1]) {
        result.push_back(samples - i - 1);
        break;
    }
    else {
        if (r[j] == false && r[j - 1] == true) {
        result.push_back(j);
        break;
    }
}

任何建议将不胜感激。

【问题讨论】:

    标签: c++ arrays cuda comparison


    【解决方案1】:

    你的问题是这一行:

            if (r[j] == false && r[j - 1] == true)
    

    你需要的是:

            if (!r[j] && r[j - 1])
    

    (我觉得这样更容易阅读:

            if (r[j - 1] && !r[j])
    

    出于某种原因。)

    在基于 C 的语言中将布尔值与 falsetrue 进行比较几乎总是很危险的。如果r 被声明为bool 类型,它应该可以工作,但否则任何非零值在测试时都将被视为“真”,但只有 1 会比较等于true。在 fact 中,与 false 的比较不会有这个问题 - 但是一旦您与一个布尔文字比较,您很容易忘记并与另一个比较。直接说不吧。

    【讨论】:

      【解决方案2】:

      我怀疑它们只是那些整数。在 C++ 中,0 == false and true = !false

      因此0 的所有值都是false,其他任何值都是true,例如6366240。这些可能就是您所发现的。

      尝试将它们类型转换为整数或将它们与已知整数进行比较,以了解它们的真正含义。

      免责声明:我不熟悉 CUDA。

      【讨论】:

        猜你喜欢
        • 2022-11-08
        • 2011-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多