有个问题比较奇怪,由于某些原因,我没办法贴出代码来具体说明。只有用语言来描述问题了。 定义了一个float2型数据,在kernel中有一个循环对float2的x,y叠加处理的,为了避免引入叠加误差,引入了kaham叠加求解处理。
用Nsight调试的时候发现对float2的x叠加的时候没问题,可就是对y叠加处理的时候,最后一条语句不执行,直接跳过开始新的一次循环了。可是从代码逻辑上看,处理x和处理y是一样的,为什么会不执行呢?
版主,抱歉。我没办法贴代码的。同时也不知道版主是否明白了我的意思,希望版主能给出一些可能的原因。谢谢!
从描述看无问题,累加float2的.y分量和累加.x分量无区别的。
因为您不能提供代码,文中的“是对y叠加处理的时候,最后一条语句不执行”之类的无法理解您指的是什么,因为无法提供具体解决方案。
而通用的解决方案包括:
(1)您确定您的.y分量的累加值(例如您可能叫它float sum之类的名字),在kernel结束之前被使用过吗?例如被写入过显存,或者作为其他表达式的一部分。如果不能保证这点,sum将被优化掉,从而进一步的您的累加过程也可能被优化掉。
(2)您尝试下rebuild all? nsight的start cuda debugging不会自动rebuild的。此时可能出现您的源代码和您实际运行的程序不匹配的情况。
请您考虑1,2。
感谢周末深夜来访。
float2 sum,eps;
sum.x=sum.y=0;
eps.x=eps.y=0;
for(int i=0;i<TW;i++){
float2 temp;
float2 value;
float2 t;
....(其他操作获得value的值)
temp.y=value.y-eps.y;
t.y=sum.y+temp.y;
eps.y=(t.y-sum.y)-temp.y;
sum.y=t.y;
temp.x=value.x-eps.x;
t.x=sum.x+temp.x;
eps.x=(t.x-sum.x)-temp.x;
sum.x=t.x;
}
程序的大概逻辑是这样的。现在的问题是,Nsight调试可以到eps.x可是,sum.x=t.x就忽略执行了。不知道什么原因。版主大人,不知道您有何高见?
这种应该是执行了的吧,要么你把他输出来看一下。。
1、您说的第二点,我是这么做。
2、对于您说的第一点,我觉得应该也不是这个问题的。
我在循环里面设置的断点,在调试时,监视器对sum.x的提示是:'sum.x’has no value at the location. :Q:Q,不知道到底是哪有问题。
ps:版主大小,我贴出的代码逻辑不是完整的,希望谅解。
楼主您确定您看了我的回复了吗?
请问您的sum.x之类的用到了吗?
(您之前的描述不完整,看上去是sum.y不存在,现在根据您的具体补充,是sum.x不存在,但建议的原因依然不变:如过您的sum.x后续真无用到的,编译器果断可以优化掉它的)
您可以不贴出完整代码,但至少涉及上文提过的代码行要多少发一下的。否则真心无法为您判断问题的。
我之前:“(1)您确定您的.y分量的累加值(例如您可能叫它float sum之类的名字),在kernel结束之前被使用过吗?例如被写入过显存,或者作为其他表达式的一部分。如果不能保证这点,sum将被优化掉,从而进一步的您的累加过程也可能被优化掉。”
楼主您:“对于您说的第一点,我觉得应该也不是这个问题的。”
–我尊重您的选择,以及在您坚持如此的情况下,我无法为您提供更进一步的参考了。
–您可以选择补充信息,或者拒绝补充信息而要求他人回复。
感谢周末来访。
抱歉,版主,是我没说清楚的。在我3楼贴出的代码中,只是kernel的中间部分,之前还有一段代码,之后也有的。叠加之和之后,sum.x和sum.y都还会用到的。
Phase_resulty=-d_gW0.y*aa;//d_gW0*delay_est_med[tid]
/*expf(-d_gW0*delay_est_med[tid]) ,欧拉公式e^ix=cosx+i*sinx*/
Phase_resultx=cosf(Phase_resulty);
Phase_resulty=sinf(Phase_resulty);
result_x=sum.x*Phase_resultx-sum.y*Phase_resulty;
result_y=sum.x*Phase_resulty+sum.y*Phase_resultx;
所以我才说应该不是您说的第一种原因的。
以及:原谅我一个非计算机专业的人理解上的偏差。
楼主您好,看到您的补充信息了,
根据您的信息,我无法理解您在最后一行上设置断点,然后查看sum.x的值,却被提示“‘sum.x’has no value at the location”的原因,按理说此处您应当观察到它的(这都循环的末尾了)
(以及,不排除我们亲爱的编译器淘气的将语句顺序调换了,导致您的循环最后的断点,实际上命中在中间的某个地方,但这个概率很低,以及编译器也不应该这样做)
所以我无法解释您的现象,
建议其他会员、版主、NVIDIA原厂支持、总版主等为您解答。
多谢版主热心的回答。这个问题困扰我几天了。
版主大人,今天发现。Nsight下调试显示不对,但是最后结果却是正确的。