2015-04-24 5 views
0

Я пытаюсь создать небольшой код для генерации чисел и вернуть результат в массив, но как только я запустил этот код, он не работает, я попытался использовать отладчик Nsight, чтобы понять, где моя проблема, но он замерзает и закрывается немедленно.Код ядра CUDA не работает

Не могли бы вы помочь мне разобраться, где проблема в этом коде?

__global__ void mykernel(int* PF_tmp, int* PL_tmp, int* QF_tmp, int* QL_tmp, 
           int m[2], int p[5], int q[5], int i, int* n, 
           int out[10][5], int N) 
    { 
     int id = blockDim.x * blockIdx.x + threadIdx.x; 

     int idx = blockIdx.x; 
     int idy = blockIdx.y; 

     int w = idx/100; 
     int x = idx%100; 
     int y = idy; 

     int z = threadIdx.x; 

     int len = ((i * 2) + 5); 


     // Fill PF_tmp & QF_tmp 
     if(i > 0){ 
      for(int k = 0; k < (i * 2); k++) 
      { 
       p[k] = PF_tmp[k]; 
       q[k] = QF_tmp[k]; 
      } 
     } 

     // Fill X 
     if(x > 10) 
     { 
      p[(i*2)] = (x - (x % 10))/10; 
      p[(i*2)+1] = x % 10; 
     }else{ 
      p[(i*2)] = 0; 
      p[(i*2)+1] = x; 
     } 

     // Fill Y 
     if(y > 10) 
     { 
      q[(i*2)] = (y - (y % 10))/10; 
      q[(i*2)+1] = y % 10; 
     }else{ 
      q[(i*2)] = 0; 
      q[(i*2)+1] = y; 
     } 

     // Fill m 
     p[(i * 2)+2] = m[0]; 
     q[(i * 2)+2] = m[1]; 

     // Fill W 
     if(w > 10) 
     { 
      p[(i*2)+3] = (w - (w % 10))/10; 
      p[(i*2)+4] = w % 10; 
     }else{ 
      p[(i*2)+3] = 0; 
      p[(i*2)+4] = w; 
     } 

     // Fill Z 
     if(z > 10) 
     { 
      q[(i*2)+3] = (z - (z % 10))/10; 
      q[(i*2)+4] = z % 10; 
     }else{ 
      q[(i*2)+3] = 0; 
      q[(i*2)+4] = z; 
     } 

     // Fill PL_tmp & QL_tmp 
     if(i > 0) 
     { 
      for(int k = 0; k < (i * 2); k++) 
      { 
       p[(len-(i * 2))+k] = PL_tmp[k]; 
       q[(len-(i * 2))+k] = QL_tmp[k]; 
      } 
     } 

     if(id<10) 
     { 
      for(int k =0; k<5; k++) 
       out[id][k] = p[k]; 
     } 

    } 



    int main() 
    { 
     cudaError err; 
     dim3 blocks(10000, 100); 
     dim3 threads(100); 

     int m[2] = {4,5}; 
     int hst_out[10][5]; 
     int p[5]; 
     int q[5]; 
     err = cudaMalloc((void **)&p, 5); 
     err = cudaMalloc((void **)&q, 5); 
     err = cudaMalloc((void **)&hst_out, 50); 

     mykernel<<<blocks, threads>>>(NULL, NULL, NULL, NULL, m, p, q, 0, NULL, hst_out, 100000000); 

     return 0; 
    } 
+0

Примечания: код не является полным. – al3ndaleeb

+0

Вы должны предоставить полный код и использовать [правильную проверку ошибок cuda] (http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the- CUDA-среда-API). –

ответ

1

Ошибка очень очевидна, это все программирование на С.

при объявлении

 
     int m[2] = {4,5}; 
     int hst_out[10][5]; 
     int p[5]; 
     int q[5]; 

Теперь hst_out, р, д не указатель, но позже он используется в качестве указателя:

 
     err = cudaMalloc((void **)&p, 5); 
     err = cudaMalloc((void **)&q, 5); 
     err = cudaMalloc((void **)&hst_out, 50); 

так и должны иметь объявить его первоначально как указатель вместо этого, например,

 
     int *p; 

и использовали его в качестве следующим образом:

 
     err = cudaMalloc((void **)&p, 5*sizeof(int)); 

И обратите внимание, что размер, который вы указали, составляет всего 5 байт .... тогда я объявил его как 5 * sizeof (int).

Для получения дополнительного примера см:

http://cuda-programming.blogspot.sg/2013/03/how-to-avoid-uses-of-cudamalloc-in.html

+0

Я попытался прежде, чем объявить p, q, hst_out как указатели, но тот же результат после запуска. Я хочу знать, почему Nsight не работает с моим кодом! Спасибо – al3ndaleeb

+0

Не знаете, как выглядел ваш новый код, возможно, вы хотите добавить в качестве дополнения? –

+0

Я думаю, что дошел до проблемы. Это из моей карты Cuda 1.1, она очень старая, а инструментарий cuda 6.5 не совместим с этой версией Cuda. Я попробую обновить карту. Спасибо – al3ndaleeb

Смежные вопросы