什么是 TRUE(240) 布尔值
What is a TRUE(240) boolean
我的一个内核比较双一维数组的每个值,验证它是否大于标量。此内核填充比较结果的布尔数组。
生成的布尔向量应以 TRUE 或 FALSE 项提供每个元素比较结果。
但我发现设备正在存储其他类型的 TRUE 值,这导致我的代码崩溃。我可以找到 TRUE (63)、TRUE (66)、TRUE (240) 等。这是什么?
请在标量为零时,下载同一个数组在两个不同时间的图像。
一维数组包含100个元素,只有第一个元素等于1,其余元素等于0。预期的结果当然是:
{真,假,假,假,...假}
我发现另一个问题的答案建议使用 32 位整数 ("Ideally you should aim to use a 32 bit type"),但我不知道该怎么做:
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++ 中,0 == false
and true = !false
因此 0
的所有值都是 false
,任何其他值都是 true
,例如 63
、66
和 240
。这些可能是您正在寻找的。
尝试将它们转换为整数或将它们与已知整数进行比较以了解它们的真实含义。
免责声明:我不熟悉 CUDA。
你的问题是这一行:
if (r[j] == false && r[j - 1] == true)
您需要的是:
if (!r[j] && r[j - 1])
(我觉得更容易理解为:
if (r[j - 1] && !r[j])
出于某种原因。)
在基于 C 的语言中将布尔值与 false
和 true
进行比较几乎总是危险的。如果将 r
声明为类型 bool
,它应该可以工作,否则任何非零值在测试时都将被视为 "true",但只有 1 会比较等于 true
.在 fact 中与 false
的比较不会有这个问题 - 但是一旦你与一个布尔文字进行比较,你很容易忘记并与另一个进行比较。就说不。
我的一个内核比较双一维数组的每个值,验证它是否大于标量。此内核填充比较结果的布尔数组。
生成的布尔向量应以 TRUE 或 FALSE 项提供每个元素比较结果。
但我发现设备正在存储其他类型的 TRUE 值,这导致我的代码崩溃。我可以找到 TRUE (63)、TRUE (66)、TRUE (240) 等。这是什么?
请在标量为零时,下载同一个数组在两个不同时间的图像。
一维数组包含100个元素,只有第一个元素等于1,其余元素等于0。预期的结果当然是: {真,假,假,假,...假}
我发现另一个问题的答案建议使用 32 位整数 ("Ideally you should aim to use a 32 bit type"),但我不知道该怎么做:
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++ 中,0 == false
and true = !false
因此 0
的所有值都是 false
,任何其他值都是 true
,例如 63
、66
和 240
。这些可能是您正在寻找的。
尝试将它们转换为整数或将它们与已知整数进行比较以了解它们的真实含义。
免责声明:我不熟悉 CUDA。
你的问题是这一行:
if (r[j] == false && r[j - 1] == true)
您需要的是:
if (!r[j] && r[j - 1])
(我觉得更容易理解为:
if (r[j - 1] && !r[j])
出于某种原因。)
在基于 C 的语言中将布尔值与 false
和 true
进行比较几乎总是危险的。如果将 r
声明为类型 bool
,它应该可以工作,否则任何非零值在测试时都将被视为 "true",但只有 1 会比较等于 true
.在 fact 中与 false
的比较不会有这个问题 - 但是一旦你与一个布尔文字进行比较,你很容易忘记并与另一个进行比较。就说不。