2015-11-27 3 views
-1

Итак, я перешел через это несколько раз и просто не могу понять, как это понять. То, что происходит, это моя переменная, которую я пытаюсь скопировать из памяти графического процессора в память процессора, всегда кажется пустой.Программирование CUDA параллельно

С моей точки зрения, я должен иметь переменную или несколько переменных и создавать копии из них, которые я буду отправлять на GPU вместе с некоторыми данными для вычисления, как только это будет сделано, вернитесь и вставьте содержимое переменной от GPU до процессора.

Но каждый раз, когда я это делаю, моя переменная 'd_result' всегда пуста. Если у кого-то есть идея, как это исправить, это было бы очень признательно.

функция

Мои CUDA:

__global__ void gpu_histogram_equalization(unsigned char * img_out, unsigned char * img_in, 
          int * hist_in, int img_size, int nbr_bin){ 

    int *lut = (int *)malloc(sizeof(int)*nbr_bin); 
    int i, cdf, min, d; 
    /* Construct the LUT by calculating the CDF */ 
    cdf = 0; 
    min = 0; 
    i = threadIdx.x; 
    while(min == 0){ 
     min = hist_in[i++]; 
    } 
    d = img_size - min; 
    if(i < nbr_bin){ 
     cdf += hist_in[i]; 
     //lut[i] = (cdf - min)*(nbr_bin - 1)/d; 
     lut[i] = (int)(((float)cdf - min)*255/d + 0.5); 
     if(lut[i] < 0){ 
      lut[i] = 0; 
     } 
    } 

    /* Get the result image */ 
    if(i < img_size){ 
     if(lut[img_in[i]] > 255){ 
      img_out[i] = 255; 
     } 
     else{ 
      img_out[i] = (unsigned char)lut[img_in[i]]; 
     } 

    } 
} 

И тогда моя функция, которая называет его:

PGM_IMG gpu_contrast_enhancement_g(PGM_IMG img_in) 
{ 
    PGM_IMG result; 
    int hist[256]; 
    unsigned char * d_result; 

    result.w = img_in.w; 
    result.h = img_in.h; 
    result.img = (unsigned char *)malloc(result.w * result.h * sizeof(unsigned char)); 

    cudaMalloc(&d_result, result.w * result.h * sizeof(unsigned char)); 

    cudaMemcpy(d_result, result.img, result.w * result.h * sizeof(unsigned char), cudaMemcpyHostToDevice); 
    histogram(hist, img_in.img, img_in.h * img_in.w, 256); 
    gpu_histogram_equalization<<<1,result.w * result.h * sizeof(unsigned char)>>>(d_result,img_in.img,hist,result.w*result.h, 256); 

    cudaMemcpy(result.img, d_result, result.w * result.h * sizeof(unsigned char), cudaMemcpyDeviceToHost); 
    cudaFree(d_result); 

    return result; 
} 
+3

Если вам нужна помощь при отладке, вам нужно будет предоставить кратчайший, полный пример, который кто-то мог бы скомпилировать и запустить, потому что код, который вы предоставили, недостаточен. Кроме того, каждый вызов API CUDA возвращает статус, вы должны проверять их все на наличие ошибок времени выполнения. Что произойдет, если вы запустите свой код с помощью cuda-memcheck? Сообщает ли он о каких-либо проблемах? – talonmies

+2

Кроме того, не могли бы вы изменить свой вопрос, чтобы описать вашу проблему. Заголовки важны для поиска, и ваш заголовок говорит абсолютно «ничего» о том, каков ваш вопрос на самом деле – talonmies

ответ

1

Давайте посмотрим на эту строку:

gpu_histogram_equalization<<<1,result.w*result.h*sizeof(unsigned char)>>> 
     (d_result,img_in.img,hist,result.w*result.h, 256); 

Вот некоторые вопросы, вы должны:

  1. img_in.img - Это память хоста
  2. истор - Это хозяин память

Что происходит, что ваше ядро ​​падает из-за недопустимый доступ к памяти.

Прочтите here об ошибке.

+2

На самом деле, если вы посмотрите на аргументы ядра в указанном вами коде, вы можете увидеть, что для любого нетривиального размера изображения размеры блока будут настолько большими, чтобы ядро ​​никогда не запускалось. – talonmies

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