Решил попытаться ускорить одну свою программку при помощи CUDA, столкнулся с глюком. Процедура, приведенная ниже какбэ должна считать стоимость пути в графе:
- __global__ void gputest(int *x, float *y, int *z, float *c, float *d, float *p, int N)
- {
- int idx = blockIdx.x * blockDim.x + threadIdx.x;
- int i,ths,next;
- float t=0;
- if (idx<N)
- {
- ths=0;
- for (i=1;i<=33;i++)
- {
- next=x[idx*33+ths];//x - это замкнутые маршруты, которые состоят ровно из 33х шагов
- t=t+c[ths*33+next];//с - это стоимости переходов от одного узла графа к другому
- ths=next;
- }
- y[idx]=t;//y - это стоимости маршрутов
- }
- }
Такая же процедура на обычном CPU, вызываемая в цикле, прекрасно забивает массив y стоимостями, на GPU она забивает его значениями -431602080, причем, если сократить количество шагов цикла for до 20ти, то получаются в некоторых элементах правильные стоимости, в других значения -35659499650496332000, в третьих #QNAN0. Может кто-нибудь знает почему так происходит?
Мне 20 шагов мало, в реальной задаче их вообще сотни, а маршрутов тысячи. Помогите пожалуйста.
PS вверху в приведенном коде должен бы стоять знак меньше перед N, но в таком случае движок форума отсекает весь текст который после него (тоже своего рода глюк :))