最近在实现一个向量相称的CUDA程序的时候,碰见一个让我很头疼的问题。基本症状是:计算结果在小数据量的时候是完全正确的,如果向量的维数增大到一定数值后,计算结果就不对了。我查了好久,终于找到了问题的源头。竟然是数据类型的问题,写下来提醒后来人!
我在内核函数中使用以下语句:
unsigned char tx = threadIdx.x;
unsigned char bx = blockIdx.x;
unsigned int id = tx + bx*blockDim.x;
id竟然不对了。我需要ls个线程,如果ls的数目足够大,使得bx的值溢出了。
解决方法是:
unsigned short bx = blockIdx.x;
在实现向量相乘的CUDA程序过程中,作者遇到了计算结果错误的问题。经过排查发现是由于数据类型选择不当导致的溢出。通过将blockIdx.x的数据类型从unsigned char改为unsigned short解决了这一问题。
934

被折叠的 条评论
为什么被折叠?



