CUDA 内核似乎忽略了"if"语句
CUDA kernel seemingly ignoring "if" statement
接下来是我的内核中行为不正常的部分,然后是我在调试时发现的内容的解释。
__global__ void Mangler(float *matrix, int *map)
{
__shared__ signed int localMap[N];
if(0 == threadIdx.x)
{
for(int i=0; i<N; i++)
localMap[i] = -1;
}
__syncthreads();
int fn = ...; // a lot of code goes into this number, skipped for clarity
int rnumber = threadIdx.x;
int X = atomicCAS(&localMap[fn], -1, rnumber); // Spot of bother 1
if(X == -1) // Spot of bother 2
{
// some code
}
else
{
// other code
}
}
我在文档中发现atomicCAS(*address, compare, value)
基本上返回(并保存到给定地址)(old == compare ? value : old)
的结果,其中 old 是执行函数之前地址处的值。
有了这个,我相信执行int X = atomicCAS(&localMap[fn], -1, rnumber);
应该有两种可能的结果(根据NVidia Cuda C编程指南):
- 如果
localMap[fn] == -1
则X
的值应为rnumber
,localMap[fn]
的值应为rnumber
。这不会发生。 - 如果
localMap[fn] != -1
则X
应设置为localMap[fn]
的值,并且所述值应保持不变。
相反,正如使用 NSight 进行调试所显示的那样,发生的情况是X
被分配为 -1,而localMap[fn]
被分配了 rnumber
的值。我不明白这一点,但正如您在代码中看到的那样,我已经更改了if
以捕获这种情况。
这让我想到了麻烦 2:尽管 NSight 将 X
的值显示为 -1,但if {}
被完全跳过(命中没有任何断点),执行直接跳到 else
。
我的问题:
我完全误解是的,我做到了atomicCAS
吗?- 什么可能导致和
if
哪些评估为真,直接跳入设备代码中的else
?
我正在使用NVidia CUDA 5.5,Windows 8上的Visual Studio 2012 x64,NVidia Nsight Monitor Visual Studio Edition 3.1。该机器的GPU是NVidia GeForce GTX 550 Ti。
我尝试将语法更改为if(X!=-1)
;if的真正分支仍未执行。
> 从文档中,atomicCAS
返回旧值,这意味着在您的列表中,您的两个结果是错误的。您的X
将始终设置为旧值 localMap[fn]
,无论它具有哪个值。根据与 -1 的比较设置的是 localMap[fn]
的新值。当它为 -1 时,它被设置为 rnumber
,否则它保持不变。
因此,您看到的X
、rnumber
和localMap
值的行为符合预期。
我无法帮助您解决第二个问题,因为我不使用 NSight,也不知道它是如何工作的 - 根据您的代码,应该评估您的真实分支(但要小心:您的错误分支也 - 因为它是多线程的,一些线程可以将条件评估为 true,有些可以评估为 false - 我的猜测/假设是您必须以某种方式告诉您的调试器您要调试哪个线程/扭曲/块,并且您看了假的)。
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 以在Qt中的IF语句中设置时间延迟
- Craps游戏问题,忽略if语句
- c++:定义if语句中的模板
- C++嵌套的 If 语句中,它无法按预期工作
- 如果条件不相关,我应该更喜欢两个 if 语句而不是 if-else 语句吗?
- 需要有关此 if 语句的帮助
- 转换器练习:跳过 if 语句和 if 语句
- 避免在 C++ 中的 if 语句中递增
- 如果仍然不满足要求,如何使 if 语句重复?
- do while 循环中的 if 语句以 yes 或 no 结尾
- 为什么在此C++代码中触发此 if 语句?
- 如何基于平台在制作文件中制作if语句?
- 在 if 语句中使用 GetKeyState 时,它会跳过条件
- C++ If 语句,从其他语句重复