2013-11-03 2 views
0

Я играл с ядром, которое отображает массив с поплавками с функцией. Я не знаю, почему, но каждый раз, когда я запускаю программу, старые результаты добавляются к новым результатам (мне кажется, что cudaFree не устанавливает свободную память, но возврат функции равен 0).Коррумпированные данные после применения ядра CUDA

Например, исходное число 0,758846 после 1-го исполнения ядра был -0,123258, но после некоторых новых казней, в результате -9,996812

Это ядро ​​и главная:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <cuda.h> 

#define PI 3.1415926 

/* f(x) = sum from i = 1 to m sin(2 * PI * i * x) */ 
__global__ void mapping(float *data_d, int sample_size, int m) { 
    int i; 
    int tid = blockIdx.x; 
    float sum; 
    if(tid < sample_size) { 
     for(i = 1; i < m + 1; i++) 
      sum += sin(2 * PI * i * data_d[tid]); 
     data_d[tid] = sum; 
    } 
} 

int main(void) { 
    int i; 
    int sample_size; 
    float *data_h, *data_d; 
    float num; 
    FILE *fp; 

    /* Get data fom file */ 
    if((fp = fopen("data.txt", "r")) != NULL) { 
     fscanf(fp, "%d", &sample_size); 

     data_h = (float*)malloc(sample_size * sizeof(float)); 

     for(i = 0; fscanf(fp, "%f", &num) != EOF; i++) 
      data_h[i] = num; 

     fclose(fp); 
    } else { 
     perror("data.txt"); 
     return 0; 
    } 

    for(i = 0; i < sample_size; i++) 
     printf("%f\n", data_h[i]); 

    /* Allocate memory on device */ 
    cudaMalloc((void**)&data_d, sample_size * sizeof(int)); 
    /* Copy data from host to device */ 
    cudaMemcpy(data_d, data_h, sample_size * sizeof(int), cudaMemcpyHostToDevice); 

    /* kernel */ 
    mapping <<< sample_size, 1 >>> (data_d, sample_size, 3); 

    cudaMemcpy(data_h, data_d, sample_size * sizeof(int), 
     cudaMemcpyDeviceToHost); 

    printf("--------\n"); 
    for(i = 0; i < sample_size; i++) 
     printf("%f\n", data_h[i]); 

    /* Free memory used */ 
    cudaFree(data_d); 
    free(data_h); 

    return 0; 
} 

Я не знаю, ошибочен ли мой код или что-то еще. Я предпочитаю первый.

ответ

2

Вы не инициализируете sum, прежде чем добавлять к нему ядро.

+0

Я скоро уйду на пенсию ... кстати, почему это происходит? это просто совпадение, что сохраненное значение после выполнения является одним и тем же результатом? –

+1

Результат, который вы описали, кажется логичным следствием не инициализации памяти, если вы считаете, что вероятность того, что 'sum' будет присвоена одному и тому же адресу в памяти GPU каждый раз, когда вы запускаете программу. –

+0

Интересно! Я этого не замечал. Спасибо за вашу помощь –

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